皮克定理(求封闭区域内整数点的个数)
皮克定理:S=a+b/2−1。
S表示多边形的面积
a表示多边形内的整数点
b表示多边形边界上的整数点。
求s的板子:
int n; cin >> n; ll x0,y0,x1,y1,S = 0; cin >> x[1] >> y[1]; x0 = x[1]; y0 = y[1]; x1 = x[1]; y1 = y[1]; for(int i=2;i<=n;i++) { cin >> x[i] >> y[i]; S += (x1*y[i]-y1*x[i]); x1 = x[i]; y1 = y[i]; } S += (x1*y0-y1*x0); S=abs(S)/2;
求边界上的整数点的个数:
ll sum = 0; for(int i=1;i<=n;i++){ if(i<n){ ll aa=abs(x[i+1]-x[i]); ll bb=abs(y[i+1]-y[i]); sum+=gcd(aa,bb)-1; }else{ ll aa=abs(x[1]-x[n]); ll bb=abs(y[1]-y[n]); sum+=gcd(aa,bb)-1; } } sum+=n;