洛谷 P2735 [USACO3.4]網 Electric Fences

題面

給出 n.m,p (n<=0,另兩者大於0)三個整數,構成三角形三個頂點是 (0,0),(n,m),(p,0)(0,0),(n,m),(p,0).
問有多少個格點(整點)在三角形內部,不包含邊上

分析

pick定理: 給定頂點座標均是整點(或正方形格子點)的簡單多邊形,皮克定理說明了其面積 A 和內部格點數目 i ,邊上格點數目 b滿足關係 A=i+b21A=i+\dfrac{b}{2} -1

這裏三角形的面積好算,邊上的點也可數(下面會說到),所以 i 是好算的。

邊上的整點數:
(n,m)(n,m) 的 n=0 或 n=p 時,會有一條垂直邊,垂直邊上的點數就是 m
對於斜邊,不難發現有 gcd 的數量。
比如 (0,0)(0,0)(9,6)(9,6) 點,中間有 (3,2),(6,4)(3,2),(6,4)點。而 gcd(9,6)=3gcd(9,6)=3,當不計一個端點時,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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章