题意:
求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 ",ans); } return 0; }