首页 > 代码库 > 51nod_1040:最大公约数之和

51nod_1040:最大公约数之和

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040

给出一个n,求1-n这n个数,同n的最大公约数的和。

比较基础的一道数论题。

//注:本人觉得理解好这里有助于去理解burnside定理的优化

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

LL Eular(LL n)
{
    LL ret=n;
    for(LL i=2; i*i<= n; i++)
        if(n%i==0)
        {
            ret-=ret/i;
            while(n%i==0) n/= i;
        }
    if(n>1) ret-=ret/n;
    return ret;
}
LL cal(LL n)
{
    LL ret=0,i;
    for(i=1;i*i<n;i++)
           if(n%i==0)
        {
            ret=ret+(n/i)*Eular(i);
            ret=ret+i*Eular(n/i);
            }
    if(i*i==n) ret+=i*Eular(i);
    return ret;
}

int main()
{
    int n;
    while(cin>>n)
        cout<<cal(n)<<endl;
}

 

51nod_1040:最大公约数之和