Hlg 1056 Electric Fence 【皮克定理】.cpp
题意:
牧场主有一个三角形的牧场
他给牧场边缘拉上了电网..
现在他想在牧场内放入很瘦很瘦的牛..(very very thin..)
问最多能放入多少头..
求出三角形 (0, 0), (n, m), (p, 0) 内的整数点坐标
思路:
有一个匹克定理:s = a+b/2-1 s表示多边形的面积 a 表示多边形内的点 b表示边上的点
有两个方法求边上的点:
①.
底边就是p
两个斜边用 n/m = x/y --->(x, y)表示斜边上坐标
遍历x点..看y是否为整数 就可以算出边上的整数点的个数了
②.
底边是p
斜边是gcd(n,m)+gcd(abs(p-n),m)
原理是 : n = a*x, m = a*y, a = gcd(n, m);
所以[1, a]*(x, y)就是斜边上的整数点了
所以a是整数点的个数
Tips:
用第一种方法算的时候应该考虑n == 0 || n > p
Code:
第一种方法总是wa..
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <cstring> 3 #include <cmath> 4 5 int gcd(int a, int b) 6 { 7 return a%b == 0?b:gcd(b, a%b); 8 } 9 10 int main() 11 { 12 int T, n, m, p; 13 int ans; 14 while(EOF != scanf("%d", &T)) 15 while(T--) { 16 scanf("%d %d %d", &n, &m, &p); 17 ans = p; 18 ans += gcd(n, m) + gcd(fabs(p-n), m); 19 ans = (s+2-ans)/2; 20 printf("%d\n",ans); 21 } 22 return 0; 23 }
题目链接:
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1056