BZOJ2705: [SDOI2012]Longge的问题

2705: [SDOI2012]Longge的问题

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 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 }
BZOJ2705

 

 
posted @ 2017-09-07 19:52  嘒彼小星  阅读(180)  评论(0编辑  收藏  举报