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;
}
posted @ 2017-08-16 19:01  XYZinc  阅读(139)  评论(0编辑  收藏  举报