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

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

时间:2017-10-05 12:20:38      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:get   space   open   nyist   span   profile   php   euler   group   

题目来源: 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


//先枚举 n 的因数,假设为k,如果一个数x,与 n 的最大公约数等于 k, 那么必定 x/k 与 n/k 互质,那么求出个数累加即可,就转化成欧拉函数了!
O(根号n*根号k...)? 反正很小了
技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define MOD 1000000007
 4 #define INF 0x3f3f3f3f
 5 #define eps 1e-9
 6 #define LL long long
 7 #define MX 1002
 8 #define MK 20002
 9 
10 LL n;
11 LL euler(LL x)
12 {
13     LL res = x;
14     for (LL i=2;i*i<=x;i++)
15     {
16         if (x%i==0)
17         {
18             res=res/i*(i-1);
19             while(x%i==0) x/=i;
20         }
21     }
22     if (x>1) res = res/x*(x-1);
23     return res;
24 }
25 
26 int main()
27 {
28     while (scanf("%lld",&n)!=EOF)
29     {
30         LL ans = 0;
31         for (LL i=1;i*i<=n;i++)
32         {
33             if (n%i==0)
34             {
35                 ans += i*euler(n/i);
36                 if (i*i!=n)
37                     ans += n/i * euler(i);
38             }
39         }
40         printf("%lld\n",ans);
41     }
42     return 0;
43 }
View Code

 




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

标签:get   space   open   nyist   span   profile   php   euler   group   

原文地址:http://www.cnblogs.com/haoabcd2010/p/7628855.html

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