51nod_1040:最大公约数之和

Posted wy_2016

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:最大公约数之和的主要内容,如果未能解决你的问题,请参考以下文章

[51nod1040]最大公约数之和

51Nod 1040 最大公约数之和

[51nod] 1040 最大公约数之和

51nod 1040 最大公约数之和(欧拉函数)

51Nod 1040 最大公约数之和

51nod 1040最大公约数和(欧拉函数)