1 /*UVA10088 2 pick定理: 3 在坐标为整数的二维平面内,对于任意多边形,有s=a+b/2-1,其中b是落在边上的点数,a是内部点数,s是多边形的面积 4 两个整点连线上的整点的个数是gcd(dx,dy) 5 You may assume that none of the coordinates will be larger than 1,000,000 in absolute 6 values. 7 */ 8 #include <iostream> 9 #include <cmath> 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <string.h> 13 #define maxn 1010 14 #define LL long long 15 using namespace std; 16 struct Point 17 { 18 double x,y; 19 Point(){} 20 Point(int xx,int yy){x=xx;y=yy;} 21 }P[maxn]; 22 typedef Point Vector; 23 //多边形有向面积 24 Vector operator + (Vector A, Vector B) 25 { 26 return Vector(A.x+B.x, A.y+B.y); 27 } 28 //点-点=向量 29 Vector operator - (Vector A, Vector B) 30 { 31 return Vector(A.x-B.x, A.y-B.y); 32 } 33 double Cross(Vector A, Vector B) 34 { 35 return A.x*B.y - A.y*B.x; 36 } 37 double Area2(Point A, Point B, Point C) 38 { 39 return Cross(B-A, C-A); 40 } 41 double PolygonArea(Point *p, int n) 42 { 43 double area = 0.0; 44 for(int i = 1; i < n-1; i++) 45 area += Cross(p[i]-p[0], p[i+1]-p[0]); 46 return area/2.0; 47 } 48 LL gcd(LL a,LL b) 49 { 50 if((a%b)==0) return b; 51 else return gcd(b,a%b); 52 } 53 int n; 54 int main() 55 { 56 while(cin>>n && n>0) 57 { 58 LL b=0; 59 for(int i=0;i<n;i++) 60 cin>>P[i].x>>P[i].y; 61 for(int i=0;i<n;i++) 62 { 63 LL dx=fabs(P[i].x-P[(i+1)%n].x); 64 LL dy=fabs(P[i].y-P[(i+1)%n].y); 65 if(dx>dy)swap(dx,dy); 66 if(dx==0) b+=dy;else if (dy==0) b+=dx;else b+=gcd(dx,dy);//注意实际的dxdy是可能等于0的 67 } 68 double S=fabs(PolygonArea(P,n)); 69 // s=a+b/2-1 70 LL ans=(LL)S+1-(LL)b/2; 71 cout<<ans<<endl; 72 } 73 return 0; 74 }