【POJ3090】Visible Lattice Points

题意

按下图方式连线,能连多少条?多组数据。N<=1000

分析

从图上可以看出来,除了连上(1,1)(1,0)(0,1)的那三条,其他连线的点都是满足x和y互质

而且左右两部分是关于y=x对称的,不妨只看一半。比如只看上面一半,根据线性规划思想,上面一半y>x

所以其实在求对于每个y,小于y且与y互质的数的个数,这不就是phi吗???

所以答案就是 ∑phi[i]*2+3

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 2010
int t,n,cnt;
int v[N],s[N],phi[N],prime[N];

void primes(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!v[i])
        {
            prime[++cnt]=i;
            v[i]=i;phi[i]=i-1;
        }
        for(int j=1;j<=cnt;j++)
        {
            if(prime[j]>n/i||prime[j]>v[i])break;
            v[prime[j]*i]=prime[j];
            phi[prime[j]*i]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
        }
    }
}

int main()
{
    scanf("%d",&t);
    primes(1010);
    for(int i=2;i<=N;i++)
        s[i]=s[i-1]+phi[i];
    for(int i=1;i<=t;i++)
    {
        scanf("%d",&n);
        printf("%d %d %d\n",i,n,2*s[n]+3);
    }    
    return 0;
 } 

 

posted @ 2018-10-08 08:06  WJEMail  阅读(113)  评论(0编辑  收藏  举报