1. 程式人生 > 其它 >P3768 簡單的數學題

P3768 簡單的數學題

\(\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);
}