萌新简单题WA0求调
查看原帖
萌新简单题WA0求调
590600
Kreado楼主2023/3/27 21:32

CODe

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=1e7+7;
ll n,p,phi[Maxn],ans,S[Maxn],inv;
int prime[Maxn],cnt;
bool isprime[Maxn];
map<ll,ll>Phi;
inline ll ksm(ll a,ll b,ll mod){
	ll z=1;
	while(b){
		if(b&1) z=z*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return z;
}
inline ll f3(ll x){
	return (x*(x+1)/2)*(x*(x+1)/2)%p;
}
inline ll f2(ll x){
	return (x*(x+1)%p*(2*x+1)%p*inv%p);
}
inline void EulerSieve(ll N){
	isprime[1]=isprime[0]=1;
	for(ll i=2;i<=N;i++){
		if(!isprime[i]) prime[++cnt]=i,phi[i-1];
		for(ll j=1;j<=cnt&&prime[j]*i<=N;j++){
			isprime[i*prime[j]]=1;
			if(!(i%prime[j])){
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			phi[i*prime[j]]=phi[i]*(prime[j]-1);
		}
	}
	for(ll i=1;i<=N;i++) S[i]=(S[i-1]+phi[i]*i*i)%p;
}
inline ll calc(ll x){
	if(x<=Maxn-7) return S[x];
	if(Phi[x]) return Phi[x];
	ll res=x*(x+1)/2;
	for(ll l=1,r;l<=x;l=r+1){
		r=x/(x/l);
		res-=(f2(r)-f2(l-1)+p)%p*calc(x/l)%p;
		res=(res+p)%p;
	}
	res=(res+p)%p;
	return Phi[x]=res;
}
int main(){
	scanf("%lld%lld",&p,&n);
	inv=ksm(6ll,p-2,p);
	EulerSieve(Maxn-7);
	for(ll l=1,r;l<=n;l=r+1){
		r=n/(n/l);
		ans=(ans+(calc(r)-calc(l-1)+p)%p*f3(n/l))%p;
	}
	printf("%lld",ans);
	return 0;
} 
2023/3/27 21:32
加载中...