[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;
}

THE END

posted @ 2021-09-06 00:03  q0000000  阅读(43)  评论(0编辑  收藏  举报