題意:
求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)。
代碼:
//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))*... */ #includeusing 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; }