在一个平面坐标系中,我们可以选出三个不全在一条线上的点构成一个三角形。我们称一个在三角形内(不包含三角形的边上),横纵坐标皆为整数的点位这个三角形的内点。 对于一个由(0,0)、(n,m)、(p,0)作为顶点构成的三角形,请你设计程序求出他的内点数。
输入包括一行,包括三个用空格分隔的整数,分别为n,m,p(0 ≤ n < 32000,0 < m < 32000,0 < p < 32000)。
输出仅一个数,为这个三角形的内点的个数。
样例输入
7 5 10
样例输出
20
这题用到皮克定理:2S=2a+b-2
S为多边形的面积,a为多边形内部的点数,b为边上的点数
所以三角形:a=S+1-b/2;
三角形面积 s=p*m/2;
(0,0)到(p,0)线段上的点数为p+1
(0,0)到(n,m)线段上的点数为gcd(n,m)+1
(n,m)到(p,0)线段上的点数为gcd(abs(n-p),m)+1
由于每个端点都被重复计算了两次,三个端点,所以要减3
所以b=p+gcd(n,m)+gcd(abs(n-p),m)
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int n,m,p;
cin>>n>>m>>p;
int s=m*p/2;
int b=p+gcd(n,m)+gcd(abs(n-p),m);
int a=s+1-b/2;
cout<<a<<endl;
}