您的位置:首页 > 其它

【欧拉函数】BZOJ2705 [SDOI2012]Longge的问题

2017-12-10 19:08 489 查看
题面在这里

考虑如下:

∑i=1n(i,n)=∑d|nd∑id≤n[(id,n)=d]=∑d|nd∑i=1nd[(i,nd)=1]=∑d|nd⋅φ(nd)

然后直接暴力就好了

示例程序:

#include<cstdio>
#include<cmath>
typedef long long ll;

ll n,N,ans;
ll phi(int x){
int res=x,ti=sqrt(x);
for (int i=2;i<=ti;i++)
if (x%i==0){
res=res/i*(i-1);
while (x%i==0) x/=i;
}
if (x>1) res=res/x*(x-1);
return res;
}
int main(){
scanf("%lld",&n);N=sqrt(n);
for (int i=1;i<=N;i++)
if (n%i==0){
ans+=i*phi(n/i);
if ((ll)i*i<n) ans+=(n/i)*phi(i);
}
printf("%lld",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: