P2158 [SDOI2008] 仪仗队 题解

题目传送门

题目大意

求出

\[\sum_{i=0}^{N-1}\sum_{j=0}^{N-1}[\gcd(i,j)=1] \]

其中 \(1\le N \le 40000\)

题目解析

直接莫比乌斯反演不就好了
首先我们知道 \(\gcd\) 的两个性质:\(\gcd(a,b)=\gcd(b,a)\)\(\gcd(0,i)=\gcd(i,0)=i\),以及欧拉函数的定义:\(\varphi(n)=\sum\limits^{n}_{i=1}[\gcd(i,n)=1]\)

\[\begin{aligned} & \sum_{i=0}^{N-1}\sum_{j=0}^{N-1}[\gcd(i,j)=1]\\ = & \sum_{i=0}^{N-1}\sum_{j=0}^{i-1}[\gcd(i,j)=1] + \sum_{i=0}^{N-1}\sum_{j=i+1}^{N-1}[\gcd(i,j)=1] + \sum_{i=0}^{N-1}[\gcd(i,i)=1]\\ = & 2\times\sum_{i=0}^{N-1}\sum_{j=0}^{i-1}[\gcd(i,j)=1]+1\\ = & 2\times\sum_{i=1}^{N-1}\varphi(i)+1 \end{aligned} \]

特别的,当 \(N=1\) 的时候答案为 \(0\)

用线性筛求出 \(\varphi(i)\),时间空间复杂度都为 \(O(n)\)

int n,isp[maxn],pr[maxn],phi[maxn],cnt;
void init(){
	int i,j; isp[1]=phi[1]=1; cnt=0;
	for(i=2;i<=n;i++){
		if(!isp[i]) pr[++cnt]=i,phi[i]=i-1;
		for(j=1;j<=cnt&&pr[j]*i<=n;j++){
			isp[pr[j]*i]=1;
			if(i%pr[j]==0){ phi[pr[j]*i]=phi[i]*pr[j]; break; }
			else phi[pr[j]*i]=phi[i]*(pr[j]-1);
		}
	} return;
}
int main(){
	n=read(); init(); int i,ans=0; if(n==1){ pc('0'); return 0; }
	for(i=1;i<n;i++) ans+=phi[i]; print(ans<<1|1); return 0;
}
posted @ 2022-06-26 16:32  jiangtaizhe001  阅读(16)  评论(0编辑  收藏  举报