求 phi 的部分是复制的,应该是其他地方有问题
#include <iostream>
#include <algorithm>
#include <string.h>
#include <iomanip>
#include <math.h>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define int long long
#define db double
#define L(i, j, k) for (int i = (j); i <= (k); ++ i)
#define R(i, j, k) for (int i = (j); i >= (k); -- i)
#define mp(x, y) make_pair(x, y)
#define pii pair <int, int>
#define vi vector <int>
#define eb emplace_back
#define pb push_back
#define sz(v) ((int) v.size())
#define mem(f, x) memset(f, x, sizeof (f))
#define ACN(i, head, u) for (int i = head[u]; i; i = e[i].nxt)
using namespace std;
template <typename INT> void rd(INT &res) {
res = 0; bool f = 0; char ch = getchar();
while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
while (ch >= '0' && ch <= '9') res = (res << 1) + (res << 3) + (ch ^ 48), ch = getchar();
res = (f ? -res : res);
}
template <typename INT, typename ...Args>
void rd(INT &res, Args &..._res) { rd(res), rd(_res...); }
//xyy
const int maxn = pow(1e10, 2.0 / 3.0);
const int N = maxn + 10;
int pre[N], prime[N], tot, phi[N], n, mod, inv; bool vis[N];
map <int, int> f;
//myj
void init() {
phi[1] = 1; inv = pow(6, mod - 2);
L(i, 2, maxn) {
if (!vis[i]) prime[++ tot] = i, phi[i] = i - 1;
L(j, 1, tot) {
if (prime[j] * i > maxn) break;
vis[prime[j] * i] = true;
if (i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; break; }
else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
L(i, 1, maxn) pre[i] = (pre[i - 1] + i * i % mod * phi[i] % mod) % mod;
}
//zyj
int S2(int n) { n %= mod; return n * (n + 1) % mod * (n << 1 | 1) % mod * inv % mod; }
int S3(int n) { n %= mod; return ( (1 + n) * n / 2 % mod) * ( (1 + n) * n / 2 % mod) % mod; }
int Sn(int n) {
if (n <= maxn) return pre[n];
if (f[n]) return f[n];
int ans = S3(n);
for (int l = 2, r; l <= n; l = r + 1) {
r = n / (n / l);
ans = (ans - (S2(r) - S2(l - 1)) % mod * Sn(n / l) % mod + mod) % mod;
}
return f[n] = ans;
}
int calc(int n) {
int ans = 0;
for (int l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
(ans += (Sn(r) - Sn(l - 1) + mod) % mod * S3(n / l) % mod) %= mod;
}
return ans;
}
signed main() {
// ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
rd(mod, n);
init();
printf("%lld\n", calc(n));
return 0;
}