首页 > 其他 > 详细

1040 最大公约数之和

时间:2018-02-03 16:44:51      阅读:218      评论:0      收藏:0      [点我收藏+]

a[] = {1,2,3,4...n}

n与a[i]的最大公约数,必定属于n的因子,所以遍历n的因子。

对于n的一个因子k,我们求出k作为最大公约数出现的次数m

如何求出m呢:

  gcd(n,a[i])==k   =>   gcd(n/k,a[i]/k)==1

这相当与求:小于n/k,且与n/k互质的数的个数,可以用欧拉函数解决

 

技术分享图片
#include<stdio.h>
#include<queue>
#include<string.h>
#include<iostream>
#include<algorithm>
#define MAXSIZE 1000005
#define LL long long
using namespace std;

LL Solve(LL n)
{
    LL ans = 1;
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
             n /= i;
             ans *= (i-1);
             while(n%i==0)
             {
                 n /= i;
                 ans *= i;
             }
        }
    }
    if(n > 1)
        ans *= (n-1);
    return ans;
}

int main()
{
    LL n,ans=0;
    scanf("%lld",&n);
    for(LL i=1;i*i<=n;i++)
    {
        if(n%i!=0)
            continue;
        ans += i*Solve(n/i);
        if(i != n/i)
        {
            ans += (n/i)*Solve(n/(n/i));
        }
    }
    printf("%lld\n",ans);
    return 0;
}
View Code

 

1040 最大公约数之和

原文:https://www.cnblogs.com/alan-W/p/8409849.html

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