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