BZOJ2705: [SDOI2012]Longge的问题
2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 3197 Solved: 1996
[Submit][Status][Discuss]
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Input
一个整数,为N。
Output
一个整数,为所求的答案。
Sample Input
6
Sample Output
15
HINT
【数据范围】
对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。
Source
【题解】
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cmath> 6 #define min(a, b) ((a) < (b) ? (a) : (b)) 7 #define max(a, b) ((a) > (b) ? (a) : (b)) 8 9 long long n; 10 11 long long phi(long long x) 12 { 13 long long ans = x; 14 long long ma = sqrt(x); 15 for(register long long i = 2;i <= ma;++ i) 16 if(x % i == 0) 17 { 18 ans -= ans/i; 19 while(x % i == 0)x /= i; 20 } 21 if(x > 1)ans -= ans/x;//显然>根号n的n的质因数只有一个 22 return ans; 23 } 24 int main() 25 { 26 scanf("%d", &n); 27 register long long last, ans = 0; 28 register long long ma = sqrt(n); 29 for(register long long d = 1;d <= ma;++ d) 30 { 31 if(n % d == 0) 32 { 33 ans += phi(d) * (n/d); 34 if(d * d != n)ans += phi(n/d) * (d); 35 } 36 } 37 printf("%lld", ans); 38 return 0; 39 }