Fence9

题目大意:

求点(0,0),(n,m),(p,0)三点构成的三角形内部(不包括边界)整点的个数。

解题过程:
1.直接枚举纵坐标,然后算出两条直线上纵坐标为y的点的横坐标,然后他们中间的点就是符合要求的。边界处理超级恶心。要特判直线没有斜率的情况,n=0或者p=n的情况。搞了好几次才AC。

2.nocow上的题解:

皮克定理说明了顶点是整点的多边形面积S和内部格点数目a、边上格点数目b的关系:S = a + b/2 - 1。根据三角形面积公式求出S。如果知道了b,那么三角形内部格点数目a也就求出来了。可以证明,一条直线((0,0),(n,m))上的格点数等于n与m的最大公约数+1。

即b=gcd(n,m)+1. gcd(n,m)为n与m的最大公约数。

代入皮克公式,即可求出a的值;

还有如何求出直线(p,0)(n,m)上的整点的个数呢。。首先把它对称一下是不会影响答案的,那么如果斜率是负,就对称一下,如何向左平移p个单位,就变成了“一条直线((0,0),(n,m))上的格点数等于n与m的最大公约数+1。”

关于皮克定理的证明。百度百科上有。

时间: 2024-11-05 18:31:53

Fence9的相关文章

usaco-3.4-fence9-passed

这个要知道一个公式: 可以算是一道数学题吧.如果知道皮克定理就行了.皮克定理说明了其面积S和内部格点数目a.边上格点数目b的关系:S = a + b/2 - 1. 根据三角形面积公式求出S.如果知道了b,那么三角形内部格点数目a也就求出来了. 可以证明,一条直线((0,0),(n,m))上的格点数等于n与m的最大公约数+1. 即b=gcd(n,m)+1. gcd(n,m)为n与m的最大公约数. /* ID: qq104801 LANG: C++ TASK: fence9 */ #include

usaco Electric Fence

这种有小数的题目总会令我格外头疼. /* ID: modengd1 PROG: fence9 LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <math.h> using namespace std; long long ans,x1,x2; int n,m,p; int main() { freopen("fence9.in"