• POJ 3090 Visible Lattice Points 【欧拉函数】


    <题目链接>

    题目大意:

    给出范围为(0, 0)到(n, n)的整点,你站在(0,0)处,问能够看见几个点。

     

    解题分析:
    很明显,因为 (1 ≤ N ≤ 1000) ,所以无论 N 为多大,(0,1),(1,1),(1,0)这三个点一定能够看到,除这三个点以外,我们根据图像分析可得,设一个点的坐标为(x,y) ,那么只有符合gcd(x,y)=1的点才能被看到。又因为 (0,0)---(n,n)对角线两端的点对称,所以我们只需算一边即可,而一边的点数根据欧拉函数可得: $sum_{i=2}^{n}varphi{(i)}$  

    所以最终的点数为:$$2*sum_{i=2}^{n}varphi{(i)}+3$$ 

    #include <cstdio>
    #define N int(1e3+10)
    typedef long long ll;
    int euler[N];
    void init(){
        euler[1]=1;
        for(int i=2;i<N;i++)euler[i]=i;
        for(int i=2;i<N;i++)
            if(euler[i]==i)
                for(int j=i;j<N;j+=i)
                    euler[j]=euler[j]/i*(i-1);
    }
    int main(){
        init();
        int T,ncase=0;scanf("%d",&T);
        while(T--){
            int n;scanf("%d",&n);
            ll ans=0;
            for(int i=2;i<=n;i++)ans+=euler[i];
            printf("%d %d %d
    ",++ncase,n,2*ans+3);
        }
    }

    2019-02-12

  • 相关阅读:
    DMA+USART重定义打印接口
    FTP初探
    ESP8266-lua开发
    GPIO常见问题分析
    新装系统简介
    java四个元注解的作用
    Linux常用操作指令
    @Autowired 与@Resource的区别(详细)
    内存溢出的几种原因和解决办法
    什么是NIO2
  • 原文地址:https://www.cnblogs.com/00isok/p/10363755.html
Copyright © 2020-2023  润新知