【杜教筛】51Nod1239[欧拉函数之和]题解
来源:互联网 发布:淘宝客qq群里的优惠券 编辑:程序博客网 时间:2024/06/04 18:18
题目概述
求
解题报告
因为
那么这道题只要像莫比乌斯函数之和一样用
示例程序
#include<cstdio>#include<map>using namespace std;typedef long long LL;const int maxn=4700000,MOD=1e9+7,INV2=MOD+1>>1;int p[maxn+5],phi[maxn+5];bool pri[maxn+5];LL n;map<LL,int> f;#define Mod(x) ((x)%MOD)inline void AMOD(int &x,int tem) {if ((x+=tem)>=MOD) x-=MOD;}inline void Make(){ pri[1]=true;phi[1]=1; for (int i=2;i<=maxn;i++) { if (!pri[i]) p[++p[0]]=i,phi[i]=i-1; for (int j=1,t;j<=p[0]&&(t=i*p[j])<=maxn;j++) if (i%p[j]) pri[t]=true,phi[t]=phi[i]*phi[p[j]]; else {pri[t]=true;phi[t]=phi[i]*p[j];break;} } for (int i=2;i<=maxn;i++) AMOD(phi[i],phi[i-1]);}int Sum(LL n){ if (n<=maxn) return phi[n];if (f.count(n)) return f[n]; int ans=Mod(Mod(Mod(n+1)*Mod(n))*INV2); for (LL l=2,r;l<=n;l=r+1) r=n/(n/l),AMOD(ans,MOD-Mod(Mod(r-l+1)*Sum(n/l))); return f[n]=ans;}int main(){ freopen("program.in","r",stdin); freopen("program.out","w",stdout); return Make(),scanf("%lld",&n),printf("%d\n",Sum(n)),0;}
阅读全文