码迷,mamicode.com
首页 > 其他好文 > 详细

51nod_1040:最大公约数之和

时间:2017-02-16 00:12:40      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:question   数论   type   cal   name   最大   lin   ble   using   

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

标签:question   数论   type   cal   name   最大   lin   ble   using   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!