标签:
Longge 的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:
定一个整数 N ,你需要求出 Σ gcd(i, N)(1<=i<=N) 。
的第一行包含一个整数 N ,如题所示
第一行包含一个整数,为所求的答案。
6
15
对于 60% 的数据, 0<N<=2^16 。
对于 100% 的数据, 0<N<=2^32 。
1 #include<iostream> 2 #include<vector> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 7 vector<long long> ys; 8 9 long long n, ans; 10 11 12 long long phi(long long n) { //欧拉函数 13 if (n == 1) return 1; 14 long long k = n; 15 for (int i = 2; i*i <= n; i++) 16 if (n % i == 0) 17 { 18 k /= i; 19 while (n % i == 0) n /= i; 20 k *= i-1; 21 } 22 if (n > 1) { 23 k /= n; 24 k *= (n - 1); 25 } 26 return k; 27 } 28 29 int main() { 30 cin >> n; 31 int nn = floor(sqrt(n)); //上界 32 for (int i = 1; i <= nn; i++) //找因数 33 if (n % i == 0) 34 if (i*i == n) ys.push_back(i); 35 else { 36 ys.push_back(i); 37 ys.push_back(n/i); 38 } 39 for (int i = 0; i < ys.size(); i++) { 40 ans += ys[i] * phi(n / ys[i]); 41 } 42 cout << ans << "\n"; 43 return 0; 44 }
标签:
原文地址:http://www.cnblogs.com/xstsow/p/4387902.html