zoj 2777 || poj 3090 Visible Lattice Points

 

 求未被挡住的点的个数。

 

挡住是 从0 0 出发的射线在到这个点之前 已经过某个点 则这个点就被挡了。

 

开始就是想找规律 结果发现不好找。YM。看别人思想,想通了,只要X Y 互质  就肯定不会被挡住。这么强大。。。

 

直接算是否互质了,算一半就可以了。

 

党的做法是,类似筛素数,一圈一圈忘外招,如果没被标记的,就是未被挡住的,然后把这一条射线上的点都标记下。。。时间比我的短好多,好强大。。。

 

PS.今天CW给我们讲多重背包的单调队列做法,好晕。。。

 

 

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; int gcd(int m,int n) { return n == 0 ? m : gcd(n,m%n); } int a[1010][1010]; int main(void) { int num[1010],ncases,sum[1010],n; memset(a,0,sizeof(a)); memset(sum,0,sizeof(sum)); for(int i=1; i<1010; i++) for(int k=i; k<1010; k++) if( gcd(i,k) == 1 ) a[i][k] = 1; a[0][1] = a[1][0] = 1; sum[1] = 3; for(int i=2; i<1010; i++) { int x = 0; for(int k=0; k<=i; k++) x += a[k][i]; x *= 2; sum[i] = sum[i-1]+x; } scanf("%d",&ncases); for(int i=1; i<=ncases; i++) { scanf("%d",&n); printf("%d %d %d/n",i,n,sum[n]); } return 0; }  

你可能感兴趣的:(zoj 2777 || poj 3090 Visible Lattice Points)