关闭

51NOD 1040 最大公约数之和(分析 + 欧拉函数)

标签: 欧拉函数
794人阅读 评论(0) 收藏 举报
分类:

传送门
1040 最大公约数之和
题目来源: rihkddd
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
Input
1个数N(N <= 10^9)
Output
公约数之和
Input示例
6
Output示例
15
解题思路:
我们首先看一下数据范围,10^9,那么我们暴力的话是绝对不可以的,那样很故意就超时了,那么我们来分析一下:要我们求的是<=n与n的最大公约数的和,那么她们的最大公约数肯定是n的因子,其实根据这个就很接近了,那么我们来举个例子,假设n=12,那么12的因子有1 2 3 4 6 12(应该就是这些吧),所以1-12中与12 的最大公约数也肯定是在这些因子中产生的,那么我们可以枚举每一个因子,将因子设为ni, 将ni的数目设为mi,那么最大的公约数之和就是

ans=nimi

ni好求,关键是求mi,那么在(m< n)的条件下GCD(n, m) = f,我们可以将这个转化为在[1-n/f]区间内与n/f互素的个数就等于GCD(n, m) = f(1<=m<=n)的个数。关键是是这个转化,那么在[1-n/f]区间内与n/f互素的个数就是求一个欧拉函数Eualr(n/f)。
上代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;
typedef long long LL;
LL Eular(LL m)
{
    LL res = m;
    for(LL i=2; i*i<=m; i++)
    {
        if(m%i==0)
        {
            res -= res/i;
            while(m%i==0)
                m /= i;
        }
    }
    if(m > 1)
        res -= res/m;
    return res;
}
int main()
{
    LL m;
    while(~scanf("%lld",&m))
    {
        LL ans = 0;
        for(LL i=1; i*i<=m; i++)
        {
            if(m%i == 0){
                ans += Eular(m/i)*i;
                if(m != i*i)
                    ans += m/i*Eular(i);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
0
0
查看评论

51Nod-1040-最大公约数之和

ACM模版描述题解很有趣的一道题,欧拉函数原来还可以这么玩~~~既然是1~n与n的公约数,那么肯定是n的因子。 每一个n的因子所对sum产生的增量为:gcd(n, i) = x(x为这个因子)的个数,也就是gcd(n / x, i / x) = 1的个数,这时,顺理成章的也就想起了phi(n / ...
  • f_zyj
  • f_zyj
  • 2016-10-10 20:00
  • 458

[51nod1040]最大公约数之和

Description求∑i=1ngcd(i,n)\sum_{i=1}^{n}gcd(i,n) n<=10^9Solution这道题有多种做法。 我们设f(n)=∑ni=1gcd(i,n)f(n)=\sum_{i=1}^{n}gcd(i,n) 那么f应该是积性函数。(证明自行脑补) 也...
  • alan_cty
  • alan_cty
  • 2016-07-06 15:31
  • 497

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

51nod1040 最大公约数之和 (欧拉函数 )
  • u013790563
  • u013790563
  • 2015-04-20 17:10
  • 861

最大公约数之和

描述 题目很简单,求出: 输入每行一个数n(n输出每个结果占一行。样例输入 12 样例输出 40 这道题采用了欧拉函数的性质, 1-12与12的最大公约数和就为 φ(1)*12+φ(2)*6+φ(3)*4+φ(4)*3+φ(6)*2+φ(12)*1 直接算...
  • wsnbb123456789
  • wsnbb123456789
  • 2015-11-28 16:15
  • 328

FZU1969(最大公约数之和)

题目:GCD Extreme   题意: Given the value of N, you will have to find the value of G. The meaning of G is given in the following code G=0; for(i...
  • ACdreamers
  • ACdreamers
  • 2013-06-01 11:52
  • 1334

FZU 1969 GCD Extreme,UESTC 1723 吴神的大脑: _数论好题(求1-n中所有数的最大公约数之和)

Problem Description Given the value of N, you will have to find the value of G. The meaning of G is given in the following code G=0; for(i=1;i...
  • duanxian0621
  • duanxian0621
  • 2012-08-09 15:20
  • 7347

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

给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 Input 1个数N(N  Output 公约数之和 Input示例 6 Ou...
  • qq978874169
  • qq978874169
  • 2016-05-06 14:53
  • 476

51nod1040

链接:点击打开链接 题意:给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6。1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起等于15 代码:#include #include #include #include #include usi...
  • stay_accept
  • stay_accept
  • 2015-09-22 20:39
  • 337

51NOD 1040 最大公约数之和(分析 + 欧拉函数)

传送门 1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在...
  • qingshui23
  • qingshui23
  • 2016-05-30 10:53
  • 794

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

题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 Description 给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2...
  • hjf1201
  • hjf1201
  • 2017-11-03 11:51
  • 61
    个人资料
    • 访问:526561次
    • 积分:11526
    • 等级:
    • 排名:第1588名
    • 原创:639篇
    • 转载:5篇
    • 译文:0篇
    • 评论:93条
    博客专栏