題面
給出 n.m,p (n<=0,另兩者大於0)三個整數,構成三角形三個頂點是 .
問有多少個格點(整點)在三角形內部,不包含邊上
分析
pick定理: 給定頂點座標均是整點(或正方形格子點)的簡單多邊形,皮克定理說明了其面積 A
和內部格點數目 i
,邊上格點數目 b
滿足關係
這裏三角形的面積好算,邊上的點也可數(下面會說到),所以 i 是好算的。
邊上的整點數:
當 的 n=0 或 n=p 時,會有一條垂直邊,垂直邊上的點數就是 m
對於斜邊,不難發現有 gcd 的數量。
比如 到 點,中間有 點。而 ,當不計一個端點時,gcd 即邊上的整點數。
代碼
#include <stdio.h>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<math.h>
using namespace std;
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
//皮克定理: 面積A= 內部格點數i + 邊上點數b/2 -1
int main()
{
int n, m, p;
cin >> n >> m >> p;
int S = m * p;//面積的平方
int linepointnum = p;//邊上點數
if (n > 0)linepointnum += gcd(n, m);
else linepointnum += m;
if (n == p)linepointnum += m;
else linepointnum += gcd(abs(n - p), m);
cout << (S + 2 - linepointnum)/2;
return 0;
}