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 }