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
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int n;
long long ans;
int p, a;
int i;
int m;
while (~scanf("%d", &n))
{
m = (int)sqrt((double)n);
ans = n;
for (i = 2; i <= m; 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 + ans * (n - 1) / n;
printf("%lld\n", ans);
}
return 0;
}