poj 2480 Longge's problem

 1 /**
 2 大意:  计算f(n) =  ∑ gcd(i, N) 1<=i <=N. 
 3 思路: gcd(i,x*y) = gcd(i,x) * gcd(i, y )  所以gcd 为积性函数
 4 又因为积性函数的和函数 也是积性函数(具体数学,了解即可)
 5 f(n) = f(p1^a1 *  p2^a2 * p3^a3*......* pn^an )
 6        =  f(p1^a1) * f(p2^a2)  * f(p3* a3) ......
 7 现在我们先单独考虑一个 f(p1^a1)
 8 f(p^k)=1*φ(p^k)+ p*φ[p^(k-1)]+p^2*φ[p^(k-2)]+…+ p^(k-1)*φ[p]+ p^k*φ[1]②
 9 由欧拉函数性质知:φ(p^k)=(p-1)*p^(k-1)①
10 
11 将①代入②得到:
12 f(p^k)= 1*φ(p^k) + p*φ[p^(k-1)] + p^2*φ[p^(k-2)] +…+  p^(k-1)*φ[p] +  p^k*φ[1]
13 =1*(p-1)*p^(k-1)+p*(p-1)*p^(k-2)+ p^2*(p-1)*p^(k-3)+…+p^(k-1)*(p-1)+p^k    (这要注意φ[1]=1不能代入①式求解)
14 =(p-1)*p^(k-1)+ (p-1)*p^(k-1)+(p-1)*p^(k-1)+…+(p-1)*p^(k-1)+ p^k
15 =k*(p-1)*p^(k-1)+ p^k
16 **/
17 #include <iostream>
18 
19 using namespace std;
20 
21 int main()
22 {
23     long long n;
24     while(cin>>n){
25         long long ans =1;
26         for(long long i=2;i*i<=n;i++){
27             long long tmp =1;
28             long long cnt =0;
29             while(n%i==0){
30                 tmp *=i;
31                 cnt++;
32                 n = n/i;
33             }
34             ans *= (cnt*(i-1)*tmp/i + tmp);
35         }
36         if(n>1){
37             ans *= 2*n-1;
38         }
39         cout<<ans<<endl;
40     }
41     return 0;
42 }

 

posted @ 2014-05-12 19:46  夜晓楼  阅读(174)  评论(0编辑  收藏  举报