Description
Longge is good at mathematics and he likes to think about hard mathematical problems which will be solved by some graceful algorithms. Now a problem comes: Given an integer N(1 < N < 2^31),you are to calculate ∑gcd(i, N) 1<=i <=N.
“Oh, I know, I know!” Longge shouts! But do you know? Please solve it.
【题目分析】
类似bzoj2705。只需要算出来欧拉函数然后一加就好了。
【代码】
#include <cstdio>
#include <cmath>
using namespace std;
long long n;
int main()
{
while(scanf("%lld",&n)!=EOF)
{
long long a,p,sqr=floor(sqrt(n*1.0)),ans=n;
for (long long i=2;i<=sqr;++i)
{
if (n%i==0)
{
a=0,p=i;
while (n%p==0) a++,n/=p;
ans=ans+ans*a*(p-1)/p;
}
}
if (n!=1) ans+=ans*(n-1)/n;
printf("%lld\n",ans);
}
}