刷USACO偶然遇到的,可能是人生中第一道正儿八经的计算几何。
题目大意:在平面直角坐标系中给你一个以格点为顶点的三角形,求三角形中的整点个数。
因为必修5和必修2的阴影很快就想到了数学中的线性规划,求出两条直线的方程,然后枚举所有整点看是否满足条件。结果莫名其妙的挂掉了,样例过不了。
既然是计算几何萌新,那就看一看题解吧。
正解是一个定理-Pick定理,内容如下
“Pick定理是说,在一个平面直角坐标系内,如果一个多边形的顶点全都在格点上,那么这个图形的面积恰好就等于边界上经过的格点数的一半加上内部所含格点数再减一。”--Matrix67,侵删。
于是我们就愉快地O(1)算出来了。
Code
1 #include<cmath> 2 #include<cstdio> 3 4 using namespace std; 5 6 int n,m,p,b,S,ans; 7 8 int gcd(int x,int y) 9 { 10 return y ? gcd(y , x%y) : x ; 11 } 12 13 int main() 14 { 15 scanf("%d%d%d",&n,&m,&p); 16 b=gcd(n,m)+gcd(fabs(n-p),m)+p; 17 S=(p*m)>>1;ans=S+1-(b>>1); 18 printf("%d",ans); 19 return 0; 20 }