Poj-2480 Longge's problem

版权声明:最后一年,加油~ https://blog.csdn.net/zzti_xiaowei/article/details/86914599

[思路]: 题目给出整数n,对从 1 1 n n 的每个数 i i ,要求计算 g c d ( i , n ) gcd(i,n) 的和。
首先,在从 1 1 n n 的每个数中,所有与 n n 互素的数 x x 的个数 n n 的欧拉 φ φ 函数 φ ( n ) φ(n) 。如果 g c d ( i , n ) = p ( 1 < p n ) gcd(i,n)=p(1<p≤n) ,则i/p和n/p互素,且满足 g c d ( i , n ) = p gcd(i,n)=p 的i的个数是 φ ( n / p ) φ(n/p) ,所以,相应的和为 p φ ( n / p ) p*φ(n/p) 。只需根据 g c d gcd 的值不同,计算 p φ ( n / p ) ∑p*φ(n/p) 即可。
中间结果为long long类型,否则爆int!

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
typedef long long ll;

int n;

ll phi(int n){
    ll ans=n;
    int f=sqrt(n+0.5);
    for(int i=2;i<=f;i++){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0)n/=i;
        }
    }
    if(n>1)ans=ans/n*(n-1);
    return ans;
}

int main()
{
    while(~scanf("%d",&n)){
        ll ans=0;
        int f=sqrt(n+0.5);
        for(int i=1;i<=f;i++){
            if(n%i==0){
                if(i*i==n)ans+=i*phi(n/i);
                else ans+=i*phi(n/i)+n/i*phi(i);
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzti_xiaowei/article/details/86914599