Bzoj 2705: [SDOI2012]Longge的问题 欧拉函数,数论

2705: [SDOI2012]Longge的问题

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 1959  Solved: 1229
[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

round1 day1

题解:

直接欧拉函数即可。。。(注意:不要用线性筛,要用时再算欧拉函数。。。)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 LL lys,ys[2010],n;
 5 void getys()
 6 {
 7     LL nn=(LL)sqrt(n),i;
 8     lys=0;
 9     for(i=1;i<=nn;i++)
10     {
11         if(n%i==0)
12         {
13             ys[++lys]=i;
14             if(i*i!=n)ys[++lys]=n/i;
15         }
16     }
17 }
18 LL phi(LL k)
19 {
20     LL kk=(LL)sqrt(k),k1=k,i;
21     for(i=2;i<=kk;i++)
22     {
23         if(k1%i==0)
24         {
25             k=(k/i)*(i-1);
26             while(k1%i==0)k1/=i;
27         }
28     }
29     if(k1!=1)k=(k/k1)*(k1-1);
30     return k;
31 }
32 int main()
33 {
34     LL k,i;
35     LL ans;
36     scanf("%lld",&n);
37     getys();
38     ans=0;
39     for(i=1;i<=lys;i++)
40     {
41         if(n%ys[i]==0)
42         {
43             k=n/ys[i];
44             ans+=(LL)phi(k)*ys[i];
45         }
46     }
47     printf("%lld",ans);
48     return 0;
49 }
View Code

 

posted @ 2016-03-17 02:13  微弱的世界  阅读(145)  评论(0编辑  收藏  举报