皮克定理:
皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式该公式可以表示为:
$S = a + \frac{b}{2} - 1$
其中 $a$ 表示多边形内部的点数,$b$ 表示多边形边界上的点数,$S$ 表示多边形的面积。
所以本题就等价于已知 $S$ ,求 $a$ 的值,进而等价于求有多少个格点在边上,即 $b$
那么如何计算一条线段上有多少格点呢?
根据小学数学知识,我们知道 $(0,0)$ 到 $(a,b)$ 形成的线段中一共有 $\gcd(a,b)$ 个格点,所以我们可以通过向量平移的方式,将一个点平移到 $(0,0)$ 上,就可以轻松的求解一条线段上有多少个格点。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef pair<int,int> PII;
#define x first
#define y second
int n,m,p;
PII q[3];
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int main(){
cin>>n>>m>>p;
q[1]={n,m},q[2]={p,0};
int s=p*m;
int b=0;
for(int i=0;i<3;++i){
for(int j=i+1;j<3;++j){
b+=abs(gcd(q[i].x-q[j].x,q[i].y-q[j].y));
}
}
cout<<(s-b+2)/2<<"\n";
return 0;
}