首页 > 其他 > 详细

51nod_1040:最大公约数之和

时间:2017-02-16 00:11:13      阅读:247      评论:0      收藏:0      [点我收藏+]

题目链接: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:最大公约数之和

原文:http://www.cnblogs.com/Just--Do--It/p/6403723.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!