2954 Triangle

問題概要

格子点を結んだ三角形が与えられる。
三角形の真に内部に含まれる格子点の個数を求めよ。

解法

ピックの定理。
格子点を結んだ多角形について、
面積=内部の点+辺上の点/2-1が成り立つ。


辺上の格子点の数はgcd(dx,dy)により求められる。

ソースコード

int main(){
	int x[3],y[3];
	for(;;){
		scanf("%d%d%d%d%d%d",x,y,x+1,y+1,x+2,y+2);
		
		bool nz=0; rep(i,3)nz=nz||x[i]||y[i];
		if(!nz)break;
		
		int a=x[1]-x[0],b=y[1]-y[0],c=x[2]-x[0],d=y[2]-y[0];
		ll area2=ll(a)*d-ll(b)*c; if(area2<0)area2*=-1;
		int edge=0;
		rep(i,3){
			int dx=abs(x[i]-x[(i+1)%3]),dy=abs(y[i]-y[(i+1)%3]);
			edge+=dx||dy?__gcd(dx,dy):dx+dy;
		}
		ll ans=(area2+2-edge)/2;
		printf("%d\n",ans);
	}
	return 0;
}