1. 程式人生 > >1040 最大公約數之和(歐拉函數)

1040 最大公約數之和(歐拉函數)

公約數 online cli 算法題 inf group mil mod +=

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


//先枚舉 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 最大公約數之和(歐拉函數)