给定一个整数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;
}
总结
数据范围来考虑做法,这里就的确无法预处理