[BZOJ] 2190: [SDOI2008]仪仗队
沿对角线对称,所以只需要考虑一半的情况,再加上另一半和对角线上唯一的(1,1)
一个人能被看见当且仅当它的斜率之前没有出现过,也就是不可约分,所以就是从第二个人开始的n-1个欧拉函数前缀和sum
ans=sum*2+(n!=1) n为1时只有他自己一个人 特判
#include<iostream> #include<cstdio> using namespace std; const int MAXN=65536; int n; int phi[MAXN],prime[MAXN],xpm[MAXN],tot; void mk(){ phi[1]=1; for(int i=2;i<=n;i++){ if(!xpm[i]) prime[++tot]=i,phi[i]=i-1; for(int j=1;j<=tot;j++){ int v=prime[j];if(v*i>n) break; xpm[v*i]=1;phi[v*i]=phi[i]*(v-1); if(i%v==0){phi[v*i]=phi[i]*v;break;} } } } int main(){ cin>>n; mk(); long long sum=0; for(int i=1;i<=n-1;i++) sum+=(phi[i]<<1); cout<<sum+(n!=1); return 0; }
本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9261579.html