zoukankan      html  css  js  c++  java
  • Visible Lattice Points(原点连线不经过其他点

    # 题意

    在一个平面坐标系中,如果一个点和原点(0,0)的连线不经过任何一个点,那么这个点就是可见的

    例如(4,2)点和(0,0)的连线会经过(2,1)点所以是不可见的

    t组数据每组给定一个n求出

    0 ≤ x,y ≤ n中所有的可见点

    数据范围:

    1 ≤ t,n ≤ 1000

    # 题解

    y=kx 第一个经过的点是可见的 , 第一个点y=k * x 的第一个点(x,y)即x和y互质,

    如果不互质即gcd(x,y)=d ,x/d,y/d 显然也在直线上

    除去(1,0)、(0,1)、(1,1)三个点以外,一个点(x,y)和原点的连写不会经过任何一个点即gcd(x,y)=1

    即互质,所以对大于1的x和y求出互质点的数量加上三个点即可

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N=1010;
     4 int primes[N],cnt;
     5 bool st[N];
     6 int phi[N];
     7 int n;
     8 void get_primes(int n){
     9     phi[1]=1;
    10     for(int i=2;i<=n;i++){
    11         if(!st[i]){
    12             primes[cnt++]=i;
    13             phi[i]=i-1;
    14         }
    15         for(int j=0;primes[j] <= n/i;j++){
    16             st[primes[j]*i]=true;
    17             if(i%primes[j]==0){
    18                 phi[i*primes[j]]=primes[j]*phi[i];
    19                 break;
    20             }
    21             phi[i*primes[j]]=phi[i]*(primes[j]-1);
    22         }
    23     }
    24 }
    25 void work(int t){
    26     cin>>n;
    27     int ans=0;
    28     for(int i=2;i<=n;i++)
    29         ans+=phi[i];
    30     ans*=2;
    31     ans+=3;
    32     cout<<t<<' ';
    33     cout<<n<<' ';
    34     cout<<ans<<endl;
    35 }
    36 int main(){
    37     get_primes(N);
    38     int t;
    39     cin>>t;
    40     for(int i=1;i<=t;i++){
    41         work(i);
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    Redis源码解析(十五)--- aof-append only file解析
    Redis源码解析(十五)--- aof-append only file解析
    Redis源码解析(十五)--- aof-append only file解析
    Storm的起源概况
    Storm的起源概况
    Storm的起源概况
    Storm的基本知识
    Storm的基本知识
    Storm的基本知识
    Redis源码解析(十六)--- config配置文件
  • 原文地址:https://www.cnblogs.com/hhyx/p/12637039.html
Copyright © 2011-2022 走看看