P3768 簡單的數學題
阿新 • • 發佈:2022-03-13
\(\text{Code}\)
#include<cstdio> #include<map> #define LL long long using namespace std; const int M = 5e6; LL n,P,inv2,inv3,f[M + 5],tot; int vis[M + 5],p[M],phi[M + 5]; map<LL,LL> mf; LL fpow(LL x,LL y) { LL res = 1; for (; x; x >>= 1,y = y * y % P) if (x & 1) res = res * y % P; return res; } LL getS(LL x){x %= P; return x * (x + 1LL) % P * inv2 % P;} LL get2S(LL x){x %= P; return getS(x) * (2LL * x + 1LL) % P * inv3 % P;} LL getf(LL x) { if (x <= M) return f[x]; if (mf[x]) return mf[x]; LL res = getS(x) * getS(x) % P; for (LL l = 2,r; l <= x; l = r + 1) r = x / (x / l),res = (res - (get2S(r) - get2S(l - 1) + P) % P * getf(x / l) % P + P) % P; return mf[x] = res; } void init() { phi[1] = f[1] = 1,inv2 = fpow(P - 2,2),inv3 = fpow(P - 2,3); for (int i = 2; i <= M; i++) { if (!vis[i]) p[++tot] = i,phi[i] = i - 1; for (int j = 1; j <= tot && p[j] * i <= M; j++) { vis[p[j] * i] = 1; if (i % p[j] == 0){phi[i * p[j]] = (LL)phi[i] * p[j] % P; break;} phi[i * p[j]] = (LL)phi[i] * phi[p[j]] % P; } f[i] = (f[i - 1] + (LL)i * i % P * phi[i] % P) % P; } } int main() { scanf("%lld%lld",&P,&n),init(); LL ans = 0; for (LL l = 1,r; l <= n; l = r + 1) r = n / (n / l),ans = (ans + getS(n / l) * getS(n / l) % P * (getf(r) - getf(l - 1) + P) % P) % P; printf("%lld\n",ans); }