1040 最大公約數之和(歐拉函數)
阿新 • • 發佈:2017-10-05
公約數 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++)View Code15 { 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 }
1040 最大公約數之和(歐拉函數)