[SDOI2012]Longge 的问题(欧拉函数)
给定 \(n(1\le n\le 2^{32})\),求 \(\sum\limits_{i=1}^n \gcd(i,n)\)。
第一步是经典的转化:\(\sum\limits_{d\vert n}d\times\sum\limits_{i=1}^n[\gcd(i,n)=d]\);
看到 \(\gcd\),往往有意识的向 \(\gcd(x,y)=1\) 上转化,以期能与 \(\varphi\) 函数相联系——\(\varphi\) 函数是可以 \(O(n)\) 欧拉筛的。
根据上述想法,所以有 \(\sum\limits_{d\vert n}d\times\sum\limits_{i=1}^{\frac{n}{d}}[\gcd(i,\frac{n}{d})=1]=\sum\limits_{d\vert n}d\times \varphi(\frac{n}{d})\)。
欧拉筛暴搓即可。下面是 AC 代码主函数核心部分:
LL n,ans=0,i=1;
scanf("%lld",&n);
for(;i*i<n;++i)
if(n%i==0) ans+=i*phi(n/i)+n/i*phi(i);
if(i*i==n) ans+=i*phi(i);
下面是欧拉筛部分:
inline LL phi(LL x){
LL ret=x;
for(LL i=2;i*i<=x;++i){
if(x%i==0){
ret=ret/i*(i-1);
while(x%i==0) x/=i;
}
}
if(x>1) ret=ret/x*(x-1);
return ret;
}