P2158 [SDOI2008] 仪仗队 题解

题目传送门

题目大意

求出

i=0N1j=0N1[gcd(i,j)=1]

其中 1N40000

题目解析

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

i=0N1j=0N1[gcd(i,j)=1]=i=0N1j=0i1[gcd(i,j)=1]+i=0N1j=i+1N1[gcd(i,j)=1]+i=0N1[gcd(i,i)=1]=2×i=0N1j=0i1[gcd(i,j)=1]+1=2×i=1N1φ(i)+1

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

用线性筛求出 φ(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 @   jiangtaizhe001  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示