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
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
long long n,p,a,ans;
while (cin >>n){
ans=n;
for (long long i=2;i*i<=n;i++){
if (n%i==0) {
p=i;a=0;
while (n%p==0){
a++;n/=p;
}
ans+=ans*a*(p-1)/p;
}
}
if (n!=1) {
ans=ans*(n*2-1)/n;
}
cout <<ans<<endl;
}
return 0;
}
#include<stdio.h>
#include<iostream>
#include<cmath>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=1000;
using namespace std;
typedef long long LL;
LL euler(LL n){
LL res=n;
for(LL i=2;i*i<=n;i++){
if(n%i==0){
res=res/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) res=res/n*(n-1);
return res;
}
int main(){
LL n;
while(scanf("%lld",&n)!=EOF){
LL ans=0;
for(LL i=1;i*i<=n;i++){
if(n%i==0){
ans+=euler(n/i)*i;
if(i*i<n) ans+=euler(i)*(n/i);
}
}
printf("%lld\n",ans);
}
return 0;
}