Longge's problem
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7550 | Accepted: 2500 |
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
Source
POJ Contest,Author:Mathematica@ZSU
题解:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
long long n,i,phi;
while(scanf("%lld",&n)!=EOF){
phi=1;
for(i=2;i*i<=n;i++){
if(n%i!=0)
continue;
long long p=0,t=1;
while(n%i==0){
n=n/i;
p++;
t=t*i;
}
phi=phi*(p*(t-t/i)+t);//F[p^k]=k*(p^k-p^(k-1))+p^k(p为质数)
}
if(n!=1){
phi=phi*(2*n-1);
}
printf("%lld\n",phi);
}
}