Acwing:通电围栏(皮克定理)

题目描述

农夫约翰的牧场可以看作是一个二维平面。

约翰为了方便看管他养的牛,构建了一个三角形的通电围栏。

他希望他的奶牛都在围栏围起的区域内活动。

三角形围栏的三个顶点位置坐标分别为 (0,0),(n,m),(p,0),该围栏由三个顶点两两相连而成。

平面上,所有位于三角形围栏内部(不包括边)且横纵坐标都为整数的点上都可以放置一头奶牛。

请问,围栏中最多可以放置多少头奶牛。

输入格式

共一行,包含三个整数 n,m,p。

输出格式

输出一个整数,表示可放置的牛的最大数量。

数据范围

0≤n<32000,
0 0

输入样例:

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)

你可能感兴趣的:(AcWing,算法)