欧拉函数 || [SDOI2008]仪仗队 || BZOJ 2190 || Luogu P2158

题面:P2158 [SDOI2008]仪仗队

题解:

显然除了(1,1),(0,1),(1,0)三个点外,对于其他点(x,y)只要满足gcd(x,y)==1就可以被看到
然后这些点是关于y=x对称的,所以直接考虑一半就可以
考虑下半部分的点(x,y)(y<x),对于每个x,小于x且与x互质的y就是答案数
于是就转化为了欧拉函数,2~N的欧拉函数和*2+3(前面那三个点)就是答案了。

代码:

 #include<cstdio>
using namespace std;
const int maxn=4e4+;
int N,phi[maxn],v[maxn],Prim[maxn],num_prim=,ans=;
inline void Get_Prime(int n){
for(int i=;i<=n;i++){
if(v[i]==){
v[i]=i;
phi[i]=i-;
Prim[++num_prim]=i;
}
for(int j=;j<=num_prim;j++){
if(v[i]<Prim[j] || i*Prim[j]>n) break;
v[i*Prim[j]]=Prim[j];
if(i%Prim[j]==)
phi[i*Prim[j]]=phi[i]*Prim[j];
else phi[i*Prim[j]]=phi[i]*(Prim[j]-);
}
}
}
int main(){
scanf("%d",&N);
N--;
Get_Prime(N);
for(int i=;i<=N;i++) ans+=phi[i];
ans=ans*+;
if(N==) ans=;
printf("%d\n",ans);
return ;
}

By:AlenaNuna

上一篇:Qt重绘机制


下一篇:题解报告:hdu 2069 Coin Change(暴力orDP)