Longge's problem POJ - 2480

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;
}
发布了399 篇原创文章 · 获赞 440 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/Aibiabcheng/article/details/105423606
今日推荐