poj 2480 Longge's problem 積性函數性質+歐拉函數,pojlongge
題意:
求f(n)=∑gcd(i, N) 1<=i <=N.
分析:
f(n)是積性的數論上有證明(f(n)=sigma{1<=i<=N} gcd(i,N) = sigma{d | n}phi(n / d) * d ,後者是積性函數),可以這麼解釋:當d是n的因子時,設1至n內有a1,a2,..ak滿足gcd(n,ai)==d,那麼d這個因子貢獻是d*k,接下來證明k=phi(n/d):設gcd(x,n)==d,那麼gcd(x/d,n/d)==1,所以滿足條件的x/d數目為phi(n/d),x的數目也為phi(n/d)。
代碼:
<pre name="code" class="cpp">//poj 2480//sep9/*f(pi^ai) = Φ(pi^ai)+pi*Φ(pi^(ai-1))+pi^2*Φ(pi^(ai-2))+...+pi^(ai-1)* Φ(pi)+ pi^ai *Φ(1) = pi^(ai-1)*(pi-1) + pi*pi^(ai-2)*(pi-1)....+pi^ai = pi^ai*(1+ai*(1-1/pi))f(n) = p1^a1*p2^a2...*pr^ar*(1+a1*(1-1/p1))*(1+a2*(1-1/p2))*... = n*(1+a1*(1-1/p1))*(1+a2*(1-1/p2))*...*/#include <iostream>using namespace std;typedef long long ll;int main(){ll n;while(scanf("%lld",&n)==1){ll ans=n;for(ll i=2;i*i<=n;++i){if(n%i==0){ll a=0,p=i;while(n%p==0){++a;n/=p;}ans=ans+ans*a*(p-1)/p;} }if(n!=1)ans=ans+ans*(n-1)/n;printf("%I64d\n",ans);}return 0;}