#include<iostream> #define MAX 110 using namespace std; typedef struct Point { double x,y; }point; typedef struct Polygon { int vexnum; int vex; point pq[MAX]; double s; }polygon; double polygon_area(polygon &p,int n) { double area = 0.0; int i; for(i=1;i<=n;i++) area+=p.pq[i-1].x*p.pq[i%n].y-p.pq[i%n].x*p.pq[i-1].y; if(area<0) area = area*(-1); return area/2; } int GCD(int x,int y) { if(y==0)return x; else return GCD(y,x%y); } int main() { int n,i,j,k,a,b; polygon p; cin>>n; for(j=1;j<=n;j++) { cin>>p.vexnum; p.vex=0; p.pq[0].x=0; p.pq[0].y=0; for(i=1;i<=p.vexnum;i++) { cin>>a>>b; p.vex+=GCD(abs(a),abs(b)); p.pq[i].x=a+p.pq[i-1].x;//是上一个点的坐标加这个移动向量 p.pq[i].y=b+p.pq[i-1].y; } double s=polygon_area(p,p.vexnum); //pick()定理 double ans=s+1-p.vex*1.0/2; printf("Scenario #%d:/n",j); printf("%.0lf %d %.1lf/n/n",ans,p.vex,s); //cout<<ans<<" "<<p.vex<<" "<<s<<endl; } system("pause"); return 0; } http://acm.pku.edu.cn/JudgeOnline/problem?id=2954