一条直线((0,0),(n,m))上的格点数(包含端点)等于n与m的最大公约数+1
皮克定理: 面积A和内部格点数目i、边上格点数目b的关系:A = i + b/2 - 1
#include<iostream>
#include<math.h>
struct Point
{
int x,y;
Point(int a=0,int b=0):x(a),y(b){}
};
Point point[100],org;
int size=0;
double xMulti(Point &a,Point &b,Point &c=org)
{
return ((a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y));
}
int countE(int a,int b)
{
if(b==0) return a;
else return countE(b,a%b);
}
int main()
{
int kase,i,k;
double area;
scanf("%d",&kase);
for(k=1;k<=kase;k++)
{
scanf("%d",&size);
int dx,dy,E=0;
point[0].x=point[0].y=0;
area=0;
for(i=1;i<=size;i++)
{
scanf("%d%d",&dx,&dy);
E+=countE(abs(dx),abs(dy));
point[i%size].x=point[i-1].x+dx;
point[i%size].y=point[i-1].y+dy;
area+=xMulti(point[i-1],point[i%size]);
}
area/=2;
int I=area+1-E/2;
printf("Scenario #%d:/n",k);
printf("%d %d %.1lf/n/n",I,E,area);
}
return 0;
}