(Large f(n)=sum_{i=1}^{n}gcd(i,n))
设 (g(n)=gcd(i,n)) ((1leq ileq n))
设 (n=ab) ,且(gcd(a,b)=1),则有 (g(n)=g(a)g(b)),所以 (g) 是积性函数;
又,由于积性函数的和也是积性函数,所以 (f(n)=sum_{i=1}^{n}gcd(i,n)) 也是积性函数。
设 (n) 的唯一分解式是 :
[n=p_1^{a_1}p_2^{a_2}...p_n^{a_n}
]
则:
[f(n)=f(p_1^{a_1}p_2^{a_2}...p_k^{a_k})=prod_{i=1}^k f(p_i^{a_i})
]
对于 (phi(n))有:
[egin{align*}
phi(n)=prod_{i=1}^k(p_i^{a_i}-p_i^{a_i-1})
color{#ddd}{=mprod_{i=1}^k1-frac1{p_i}}
end{align*}
]
对于 (f(p^{a})) 有:
[egin{align*}
f(p^a)&=phi(p^a)+pphi(p^{a-1})+...+p^aphi(1)\
&=(p^a-p^{a-1})+p(p^{a-1}-p^{a-2})+...+p^{a-1}(p-p^0)+p^a\
&=a(p^a-p^{a-1})+p^a
end{align*}
]
所以:
[egin{align*}
f(n)&=f(p_1^{a_1}p_2^{a_2}...p_k^{a_k})\
&=prod_{i=1}^k f(p_i^{a_i})\
&=prod_{i=1}^ka_i(p_i^{a_i}-p_i^{a_i-1})+p_i^{a_i}
end{align*}
]
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
inline ll kpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)ans*=a;
a*=a;
b>>=1;
}
return ans;
}
int pri[maxn+5];
void init()
{
for(int i=2;i<maxn;i++)
{
if(!pri[i])pri[++pri[0]]=i;
for(int j=1;j<=pri[0]&&i*pri[j]<maxn;j++)
{
pri[i*pri[j]]=1;
if(i%pri[j]==0)break;
}
}
}
int fac[maxn],num[maxn];
inline ll cal(ll p,ll a){return kpow(p,a)+kpow(p,a-1)*a*(p-1);}
int main()
{
init();
int n;ll ans=1;
scanf("%d",&n);
for(int i=1;pri[i]*pri[i]<=n;i++)
{
if(n%pri[i]==0)
{
fac[++fac[0]]=pri[i];
while(n%pri[i]==0)n/=pri[i],num[fac[0]]++;
}
}
if(n>1)fac[++fac[0]]=n,num[fac[0]]=1;
for(int i=1;i<=fac[0];i++)
ans*=cal(fac[i],num[i]);
printf("%lld
",ans);
}