您的位置:首页 > Web前端

usaco 3.4 Electric Fence 皮克定理

2008-08-20 19:25 393 查看
一条直线((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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: