一条直线((0,0),(n,m))上的格点数(包含端点)等于n与m的最大公约数+1
皮克定理: 面积A和内部格点数目i、边上格点数目b的关系:A = i + b/2 - 1
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- /*
- PROG: fence9
- LANG: C++
- ID: heben991
- */
- struct point
- {
- long long x,y;
- };
- long long Abs(long long x)
- {
- if(x<0)x=-x;
- return x;
- }
- long long cross(point a, point b)
- {
- return a.x*b.y - a.y*b.x;
- }
- //多变形面积
- long long area(point p[], int n = 3)
- {
- int i, j, k;
- long long s, ss = 0;
- for(i = 0; i < n; i++)
- {
- j = (i+1)%n;
- s = cross(p[i],p[j]);
- ss += s;
- }
- return Abs(ss)/2;
- }
- // a,b整点之间的整点个数,包含a,b
- long long gcd(long long a, long long b)
- {
- while(a && b)
- {
- a%=b;
- if(a) b%=a;
- }
- return a+b;
- }
- //一条直线((0,0),(n,m))上的格点数(包含端点)等于n与m的最大公约数+1
- long long countgrid(point a, point b)
- {
- long long x = Abs(a.x-b.x), y = Abs(a.y-b.y);
- return gcd(x,y);
- }
- //多变形内整点个数,不包含边界pku 2954 1256
- //皮克定理: 面积A和内部格点数目i、
- //边上格点数目b的关系:A = i + b/2 - 1
- long long internal_grid(point p[], int n = 3)
- {
- long long a = area(p,n), in, b=0, t;
- int i;
- for(i = 0; i < n; i++)
- {
- t = countgrid(p[i], p[(i+1)%n]);
- b += t;
- }
- in = a - b/2 + 1;
- return in;
- }
- int main()
- {
- freopen("fence9.in", "r", stdin);
- freopen("fence9.out","w",stdout);
- point t[3] = {0};
- cin >> t[1].x >> t[1].y >> t[2].x;
- cout << internal_grid(t) << endl;
- return 0;
- }