描述
在这个问题中,平面中的“格点”是具有整数坐标的点。
为了容纳他的奶牛,农夫约翰建造了一个三角形的电栅栏,将一根“热”线从原点(0,0)串到晶格点[n,m](0<=n<32,000,0<m<32,000),然后到正x轴[p,0](0<p<32,000)上的晶格点,然后回到原点(0,0)。
可以在围栏内的每个格子点放置一头牛,而无需接触围栏(非常薄的奶牛)。奶牛不能放在栅栏接触的格子点上。一个给定的围栏可以容纳多少头奶牛?
输入
单个输入行包含三个空格分隔的整数,分别表示 n、m 和 p。
输出
带有单个整数的单行,表示指定的围栏可以容纳的奶牛数量。
样例输入
7 5 10
样例输出
20
题解
本题给出一个三角形需要我们求出不包括边缘的三角形内部所有整点数。这里可以用到皮克定理, (S为三角形面积,n1为边上整点个数,n2为内部整点个数)。这个定理大家可以去搜一下,知乎的证明很详细。我们知道这个公式后问题也就变成了已知三点求三角形面积与边上整点个数。由于已知图形的一条边以及对应的高所以面积易得。然后就是求线上整点个数,也就是求ax+by=c的整数解,这时需要用到欧几里德算法,最后带入公式就可以求得答案了。
#include<bits/stdc++.h>
using namespace std;
int gcd(int x,int y)
{
if(y==0)return x;
else
return gcd(y,x%y);
}
int main ()
{
int n,m,p;
cin>>n>>m>>p;
int s=p*m/2;
int l1=gcd(n,m);
int l2=gcd(p,0);
int l3=gcd(abs(n-p),m);
printf("%d\n",s-(l1+l2+l3)/2+1);
return 0;
}