给出一个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 ",ans); 41 } 42 return 0; 43 }