bzoj2190 [SDOI2008]仪仗队
题目
http://www.lydsy.com/JudgeOnline/problem.php?id=2190
题解
不难发现,对于处在(x,y)且x,y互质的位置上的人才能被看见,即求小于x且与x互质的数的个数
筛法求欧拉函数
代码
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#define N 40005
#define ll long long
using namespace std;
int n,prime[N],phi[N],num;
bool flag[N];
ll ans;
int main()
{
phi[1]=1;
for(int i=2;i<=40000;i++)
{
if(!flag[i]) prime[++num]=i,phi[i]=i-1;
for(int j=1;j<=num&&i*prime[j]<=40000;j++)
{
int p=i*prime[j];flag[p]=1;
phi[p]=phi[i]*phi[prime[j]];
if(i%prime[j]==0){phi[p]=phi[i]*prime[j];break;}
}
}
scanf("%d",&n);
for(int i=1;i<n;i++) ans+=phi[i];
printf("%d",ans*2+1);
return 0;
}