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

 

posted @ 2018-07-04 08:50  GhostCai  阅读(98)  评论(0编辑  收藏  举报