Visible Lattice Points

题目链接

题意:给个N*N的矩形点,求在原点看去能看到多少个点

思路:除了(1,0),(0,1),(1,1)外其他点的xy都互质。所以求欧拉函数。fhi[i]从2加到n,再是两倍,再加3。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
const int max_n=100010;
int v[max_n],prime[max_n],phi[max_n];
void euler(int n)
{
    memset(v,0,sizeof(v));
    int m=0;
    for(int i=2;i<=n;i++)
    {
        if(v[i]==0)
        {
            v[i]=i;
            prime[++m]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=m;j++)
        {
            if(prime[j]>v[i]||prime[j]>n/i)
            break;
            v[i*prime[j]]=prime[j];
            phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
        }
    }
}
int main()
{
    int n;
    euler(100000);
    int t;
    
    scanf("%d",&t);
    int x=0;
    while(t--){
        scanf("%d",&n);
        long long sum=0;
        for(int i=2;i<=n;i++)
        sum+=phi[i];
        sum=sum*2+3;
        printf("%d ",++x);
        printf("%d ",n);
        printf("%lld\n",n==0?0ll:sum);
    }
 } 

猜你喜欢

转载自www.cnblogs.com/2462478392Lee/p/11299887.html