题目概述
求 ∑ni=1φ(i) 。
解题报告
因为 n=∑ni=1∑nj=1[gcd(i,n)=j]=∑d|n∑ndi=1[gcd(i,nd)=1]=∑d|iφ(nd) ,所以 Id=φ∗1 。
那么这道题只要像莫比乌斯函数之和一样用
1
卷
S(n)=∑i=1nId(i)−∑i=2nS(⌊ni⌋)=n(n+1)2−∑i=2nS(⌊ni⌋)
示例程序
#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;
}