bzoj2705(欧拉函数)

来源:互联网 发布:gta5亚洲妹子捏脸数据 编辑:程序博客网 时间:2024/06/17 12:37

给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。

0<N<=2^32。

数据太大,phi函数无法预处理,所以要直接算,这里是要枚举他的因数,以该因数为gcd的数量来算,典型题

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;ll n;ll phi(ll n){ll ans=n,sq=(ll)sqrt(n);for (int i=2;i<=sq;i++)if (n%i==0){ans=ans/i*(i-1);while (n%i==0) n/=i;}if (n>1) ans=ans/n*(n-1);return ans;}int main(){scanf("%lld",&n);ll ans=0,sq=(ll)sqrt(n*1.0);for (int i=1;i<=sq;i++)if (n%i==0){ans+=i*phi(n/i);if (i*i==n) continue;ans+=n/i*phi(i);}printf("%lld",ans);return 0;}

总结

数据范围来考虑做法,这里就的确无法预处理

0 0
原创粉丝点击