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.
Input
Input contain several test case.
A number N per line.
Output
For each N, output ,∑gcd(i, N) 1<=i <=N, a line
Sample Input
2
6
Sample Output
3
15
本来以为和bzoj 2705一个尿性,再在poj水个ac,结果。。。
poj时限卡的太紧,TLE(吓)。
翻到了某神犇的博客,忍不住想膜,传送门。看着就觉得害怕,我不解释了,反正也说不清。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
long long ans;
int main()
{
while(scanf("%d",&n)==1)
{
int a,sqr=sqrt((double)n);
ans=n;
for(int i=2;i<=sqr;i++)
if(n%i==0)
{
a=0;
while(n%i==0)
n/=i,a++;
ans+=ans*a*(i-1)/i;
}
if(n!=1)
ans+=ans*(n-1)/n;
printf("%lld\n",ans);
}
return 0;
}