C

POJ - 2480

(sum_{i=1}^{n}gcd(i,n)~(1leq nleq 10^9))

显然有

[sum_{i=1}^{n}gcd(i,n)=sum_{d|n}dvarphi(frac nd) ]

(考虑 (varphi) 的意义)

然后直接做随便做。

Code

#include<iostream>
#include<cstdio>
using namespace std;

long long getphi(long long x){
    long long ret=1;
    for(int i=2;1ll * i*i<=x;++i){
        if(x%i==0){
            for(ret*=i-1;(x/=i)%i==0;ret*=i);
        }
    }
    return x>1?ret*(x-1):ret;
}

int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        long long ans = 0;
        for(int i = 1; 1ll *  i * i <= n; ++ i){
            if(n % i != 0) continue;
            long long x = getphi(i), y = getphi(n/i);
            ans += x * (n/i) + y * i;
            if(i * i == n) ans -= x * i;
        }
        printf("%lld
",ans);
    }

    return 0;
}

原文地址:https://www.cnblogs.com/zzhzzh123/p/13373806.html