题目描述
农夫约翰的牧场可以看作是一个二维平面。
约翰为了方便看管他养的牛,构建了一个三角形的通电围栏。
他希望他的奶牛都在围栏围起的区域内活动。
三角形围栏的三个顶点位置坐标分别为 (0,0),(n,m),(p,0),该围栏由三个顶点两两相连而成。
平面上,所有位于三角形围栏内部(不包括边)且横纵坐标都为整数的点上都可以放置一头奶牛。
请问,围栏中最多可以放置多少头奶牛。
输入格式
共一行,包含三个整数 n,m,p。
输出格式
输出一个整数,表示可放置的牛的最大数量。
数据范围
0≤n<32000,
0<m<32000,
0<p<32000输入样例:
7 5 10
输出样例:
20
解题思路
本题直接求解非常难做,需要掌握皮克定理进行求解。
皮克定理描述如下 :
皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式,该公式可以表示为S=a+b÷2-1,其中a表示多边形内部的点数,b表示多边形落在格点边界上的点数,S表示多边形的面积
面积S显然很好求,而b的计算方法是:将每个边长中的一个点移动到原点,此时不在原点的那个顶点的坐标假设为(x,y), 此时这个边长上的整点数量 = x 和 y 的最大公因数。
Python3代码
from math import gcd
n,m,p = map(int,input().split())
point = [(0,0),(n,m),(p,0)]
s = m * p
b = 0
for i in range(3) :
for j in range(i+1,3) :
b += abs(gcd(point[i][0] - point[j][0], point[i][1] - point[j][1]))
print((s - b + 2) // 2)