tzoj5103 Electric Fence 电网
题目大意
给定三个正整数n,m和p,将(0,0) (n,m) (0,p) 这三个点相连,求围成的三角形中的格点数目(三角形边上的格点不算)
利用皮克定理求出。
皮克定理
顶点全在格点上的多边形面积S=n+T/2-1。
n为多边形内部格点数量,T为多边形边上的格点数量。
解题方法
内部格点数量n=S-T/2+1。
三角形面积S直接用面积公式求出。三角形底边格点数量为P+1,另外两条边上的格点数量用为gcd(n,m)+1和gcd(abs(n-p),m)+1,再减去重复的三个顶点,求出T。
代码
#include <bits/stdc++.h> #define IO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); using namespace std; // S-T/2+1=n // S=p*m/2 // T=p+1+gcd(n,m)+1+gcd(m, abs(n-p))+1-3; int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } signed main() { IO; int n, m, p; cin >> n >> m >> p; cout << p * m / 2 - (gcd(n, m) + p + gcd(m, abs(n - p))) / 2 + 1 << endl; return 0; }