萌新简单题WA0求调
查看原帖
萌新简单题WA0求调
590600
Kreado楼主2023/3/28 18:40

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/28 18:40
加载中...