hdu 1705 Count the grid(皮克定理)

题目链接:hdu 1705 Count the grid

题意:

给定一个三角形三点坐标,问三角形内有多少个坐标均为整数的点。

题解:

给定顶点坐标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积 S 和内部
格点数目 n、边上格点数目 s 的关系:S = n +s/2+1

三角形两向量叉积/2=面积。

向量上整数点数为gcd(v.x,v.y)(此公式对于一条边上的结果不准确,但是三条边加在一起的和是准确的)

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4
 5 struct point
 6 {
 7     int x,y;
 8     point(){}
 9     point(int _x,int _y):x(_x),y(_y){}
10     point operator -(point b){return point(x-b.x,y-b.y);}
11 }p[3];
12
13 int cross(point a,point b){return a.x*b.y-b.x*a.y;}
14
15 int main()
16 {
17     while(~scanf("%d%d%d%d%d%d",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y))
18     {
19         if(!p[0].x&&!p[0].y&&!p[1].x&&!p[1].y&&!p[2].x&&!p[2].y)break;
20         int tmp=0;
21         F(i,0,2)
22         {
23             point t=p[(i+1)%3]-p[i];
24             tmp+=__gcd(abs(t.x),abs(t.y));
25         }
26         int s=abs(cross(p[2]-p[0],p[1]-p[0]));
27         printf("%d\n",(s-tmp+2)/2);
28     }
29     return 0;
30 }

时间: 2024-11-03 05:31:54

hdu 1705 Count the grid(皮克定理)的相关文章

HDU 1705 Count the grid &amp;&amp; jisuanke 35 三角形内点

链接:click here 题意: 给出一个三角形,求三角形内的整点: 皮克定理:S=a/2+b-1; S为多边形面积:a为多边形边上的点: b为多边形内的点: a为边上的点可以由欧几里得定理gcd(x1-x0,y1-y0)求得点数: 另编程网站计蒜客35题也是一样的求法,只不过给出两点,实际写的话改成注释的那块就可以,链接:click here 代码: #include <math.h> #include <queue> #include <map> #include

poj1265&amp;&amp;2954 [皮克定理 格点多边形]【学习笔记】

Q:皮克定理这种一句话的东西为什么还要写学习笔记啊? A:多好玩啊... PS:除了蓝色字体之外都是废话啊...  Part I 1.顶点全在格点上的多边形叫做格点多边形(坐标全是整数) 2.维基百科 Given a simple polygon constructed on a grid of equal-distanced points (i.e., points with integer coordinates) such that all the polygon's vertices a

POJ 2954 Triangle (皮克定理, 三角形叉乘求面积)

Triangle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5303 Accepted: 2297 Description A lattice point is an ordered pair (x, y) where x and y are both integers. Given the coordinates of the vertices of a triangle (which happen to be lat

皮克定理及其应用

H - 三角形 4.1 Description A lattice point is an ordered pair (x,y) where x and y are both integers. Given the coordinates of the vertices of a triangle(which happen to be lattice points), you are to count the number of lattice points which lie complete

[POJ2954&amp;POJ1265]皮克定理的应用两例

皮克定理: 在一个多边形中.用I表示多边形内部的点数,E来表示多边形边上的点数,S表示多边形的面积. 满足:S:=I+E/2-1; 解决这一类题可能运用到的: 求E,一条边(x1,y1,x2,y2)上的点数(包括两个顶点)=gcd(abs(x1-x2),abs(y1-y2))+1; 求S:刚开始做POJ2954的时候莫名其妙一直WA,用了海伦公式求面积,后来又改用割补法,还是WA.发现面积还是用叉积算的好. 在八十中走廊里看过的书都忘光了啊...这么典型的叉积运用都会选择小学方法...不过至今没

HDU 4916 Count on the path

题意: 给定一棵树和m个询问  每个询问要求回答不在u和v两节点所形成的路径上的点的最小标号 思路: 一开始以为是LCA-  不过T了好几次-  后来发现不用LCA也可做 考虑每个询问u和v  如果他们的lca不是1  则1一定是答案  不过求lca会T  那么我们只需要在遍历树的时候给节点染色  染的颜色就是1的儿子的颜色  如果x这个点在y的子树中(y是1的儿子)那么他的颜色就是y 染完色后我们考虑答案是如何构成的 如图所示  答案即是  红色  蓝色  绿色的子树中节点的最小值  那么我们

hdu 4704 Sum (费马小定理+快速幂)

//(2^n-1)%mod //费马小定理:a^n ≡ a^(n%(m-1)) * a^(m-1)≡ a^(n%(m-1)) (mod m) # include <stdio.h> # include <algorithm> # include <string.h> # define mod 1000000007 using namespace std; __int64 pow(__int64 n) { __int64 p=1,q=2; while(n) { if(n%

HDU 1573 X问题 中国剩余定理

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题意:求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod a[i] = b[i], - (0 < a[i] <= 10). 思路:中国剩余定理的模板题,如果找不到这样的数或者最小的X大于N,输出零. 代码: #include <iostream> #include

HDU 3037 Saving Beans (Lucas定理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3037 推出公式为C(n + m, m) % p, 用Lucas定理求大组合数取模的值 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int t; long long n, m, p; long long pow(long long n, long lo