[杜教筛] 51Nod 1239: 欧拉函数之和

来源:互联网 发布:手机拍摄淘宝照片 编辑:程序博客网 时间:2024/06/04 17:45

题意

ni=1ϕ(i)
n1010

题解

模板题,取1与ϕ卷,

S(n)=(1+n)n2i=2nS(ni)

#include<cstdio>#include<map>#include<cstring>#include<algorithm>#include <tr1/unordered_map> using namespace std;using namespace std::tr1; const int maxn=1000005, N=1000000, MOD=1000000007, inv=500000004; typedef long long LL;int Q; LL p[maxn],phi[maxn];bool vis[maxn];void get_phi(){    memset(vis,1,sizeof(vis));    phi[1]=1;    for(int i=2;i<=N;i++){        if(vis[i]) p[++p[0]]=i, phi[i]=i-1;        for(int j=1;j<=p[0]&&p[j]*i<=N;j++){            vis[p[j]*i]=false;            if(i%p[j]==0){ phi[p[j]*i]=phi[i]*p[j]%MOD; break; }            phi[p[j]*i]=phi[i]*phi[p[j]]%MOD;        }    }     for(int i=1;i<=N;i++) (phi[i]+=phi[i-1])%=MOD;}unordered_map< LL, LL > lst; LL Sum(LL n){    if(n<=N) return phi[n];    if(lst.find(n)!=lst.end()) return lst[n];    LL res=n%MOD*((1+n)%MOD)%MOD*inv%MOD;    for(LL i=2,nxt;i<=n;i=nxt+1){        nxt=n/(n/i);        (res+=MOD-Sum(n/i)*(nxt-i+1)%MOD)%=MOD;    }    return lst[n]=res;}int main(){    freopen("51nod1239.in","r",stdin);    freopen("51nod1239.out","w",stdout);    get_phi();    LL n; scanf("%lld",&n);    printf("%lld\n",(Sum(n)+MOD)%MOD);    return 0;}
原创粉丝点击