欧拉函数

定义baidu

bzoj2190

首先我们可以发现横坐标和纵坐标必须互质,否则会有个和他相似的小三角形挡住他

然后就不知所措了,脑补了奇怪的做法,然后发现只要欧拉函数乘一乘就可以了

p[i]:i的欧拉函数 ans=2*p[1-(n-1)]的和+1

但是我不知道怎么快速地求出欧拉函数。。。

结果发现竟然有一些奇怪的性质,代码里有。。。

#include<cstdio>
#include<cstring>
#define N 40010
using namespace std;
int n,tot;
int p[N],prime[N],mark[N];
int main()
{
    scanf("%d",&n);
    if(n==1)
    {
        printf("0");
        return 0;
    }
    if(n==2)
    {
        printf("3");
        return 0;
    }
    p[1]=1;
    for(int i=2;i<n;i++)
    {
        if(!mark[i]) 
        {
            prime[++tot]=i;
            p[i]=i-1;
        }
        for(int j=1;j<=tot&&prime[j]*i<=n;j++)
        {
            mark[prime[j]*i]=1;
            if(i%prime[j]==0) p[i*prime[j]]=p[i]*prime[j];
            else p[i*prime[j]]=p[i]*(prime[j]-1);
        }
    }
    int ans=0;
    for(int i=1;i<n;i++)
    {
        ans+=p[i];
    }
    printf("%d",2*ans+1);
    return 0;
}

 

posted @ 2016-12-14 22:11  19992147  阅读(160)  评论(0编辑  收藏  举报