皮克定理
对于每个顶点都落于整点上的多边形,有S = N + M/2 - 1(其中,S为多边形面积,N为多边形内部的整点数,M为多边形边上的点数)
该定理一般用于求N,因为S和M都相对好求。下面简单提一下S和M的求法。
对于多边形的面积,我们可以将其划分为若干三角形,然后用向量的叉积。
```C++
inline ll cross(P a,P b)
{
return a.fi*b.se-b.fi*a.se;
}
ll area(P* p,int n)
{
ll res=0;
p[n]=p[0];
for (int i=0;i<=n;++i)
res+=cross(p[i],p[i+1]);
return abs(res/2);
}
```
对于一条边上的点数,可以
```C++
gcd( abs(p[i].fi - p[i-1].fi), abs(p[i].se - p[i-1].se) ) + 1;
```
得到p[i]与p[i-1]之间的点数(包括两端点)。
求得S与M后,代入公式求得N。