51nod 1040 最大公约数之和

来源:互联网 发布:印度航母 知乎 编辑:程序博客网 时间:2024/06/08 22:46

1040 最大公约数之和

基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
收藏 关注
给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
Input
1个数N(N <= 10^9)
Output
公约数之和
Input示例
6
Output示例
15

题解:

  我们可知1~n与n的最大公约数,都是n的因子。  每个因子对他的贡献为gcd(n,i)=x;我们可以想到gcd(n/x,i/x)=1;  也就是求phi(n/x) *x之和,我们枚举到根号,因为可以由n/x可以求出另一个因子x

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;typedef long long LL;LL Eular(LL m){   int res=m;   for(int i=2;i*i<=m;i++)   {       if(m%i==0)       {           res-=res/i;           while(m%i==0)            m/=i;       }   }   if(m>1) res-=res/m;   return res;}int main(){    int n;    cin>>n;    long long sum=0;    for(int i=1;i*i<=n;i++)    {       if(n%i==0)       {           int tmp=n/i;           sum+=Eular(tmp)*i;           if(i!=tmp)           {               sum+=Eular(i)*tmp;           }       }    }    cout<<sum<<endl;    return 0;}