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.
"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.
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
Source
POJ Contest,Author:Mathematica@ZSU
(POJ的描述比较生动有趣,就贴了POJ的~)
(翻译见BZOJ 2705~)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
思路见:http://www.cnblogs.com/JS-Shining/archive/2012/05/14/2500661.html ~
分解n得k|n,则题目变为求k*φ(n/k)~
然后就套欧拉函数~
#include<cstdio>
#define ll long long
ll ans,n,a;
int main()
{
while(scanf("%lld",&n)!=EOF)
{
ans=n;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
a=0;
while(n%i==0)
{
a++;n/=i;
}
ans+=ans*a*(i-1)/i;
}
}
if(n!=1) ans=ans*(n*2-1)/n;
printf("%lld\n",ans);
}
return 0;
}