题目大意
解题思路
(1) 当直线斜率存在时,格点数为
(2) 当斜率不存在且
时,格点数为
(3) 当斜率不存在且
时,格点数为0.
证明如下:
: 当斜率不存在时,很容易得出(2),(3)结论。
: 当斜率存在时。 斜率为
。当横坐标增加
, 则对应纵坐标增加
, 很明显,要格点最多,且每次增加都落在格点上,我们希望 (1)每次增加的距离
要尽量小。(2)
和
都是整数。
- 直接令 为整数。
- 对 : 有 .其中 为分子分母最大公约数。要使其为整数,则 能够整除 .而要使 最小,则其就等于 .
- 因此要格点最多,且每次增加都落在格点上,则 , 对应的格点数目为
- 得证。
代码
#include<iostream>
using namespace std;
int abs(int x)
{
if(x < 0)
return -x;
return x;
}
int gcd(int a, int b)
{
if(a < b)
swap(a, b);
if(b == 0)
return a;
return gcd(b, a%b);
}
int main()
{
int x1,y1,x2,y2;
cin >> x1 >> y1 >> x2 >> y2;
if(x1 == x2)
{
if(y1 == y2)
cout << 0 << endl;
else
cout << abs(y1-y2)-1 << endl;
}
else
{
cout << gcd(abs(y1-y2), abs(x1-x2)) - 1 << endl;
}
return 0;
}