流星

流星

时间限制: 1 Sec  内存限制: 128 MB

题目描述

我带着深藏骨血的仇恨与酝酿多年的阴谋
把自己变成一个死而复生的幽灵沉入沼泽,沉入深渊
我想埋下腐烂的根系长出见血封喉的荆棘刺穿这个虚伪的文明
我到了淤泥深处……捡到了一颗星星。
晨光起于白塔尖顶,终将铺满阴霾之地。
Marser正在和副词看星星。这时,他们发现了一颗流星划过天际。Marser出于习惯,记录下了这颗流星出现和消失的位置。Marser两组坐标来描述这两个位置。你可以认为它们被Marser放在了一个原点由Marser指定的笛卡尔坐标系中。

现在,副词为了考验Marser的智商,想问他一个问题:按照Marser的坐标系定义,这颗流星一共经过了多少个格点?这里,格点被定义为坐标均为整数的点。

Marser用了1ms就完成了这个问题,于是他想用这个问题来测试您的智力。当然,为了简化您的操作,您可以把流星的运动轨迹看成一条直线。这样,您可以把这个问题转化为求一条线段除了端点外经过了多少个格点。

输入

读入两行,每行两个整数 x,y,表示线段的两个端点的坐标。

输出

输出一行一个整数,表示除了两个端点外,线段经过的格点数量。

样例输入

1 11
5 3

样例输出

3

提示

对于30%的数据,保证max(∣x∣,∣y∣)≤103;
对于60%的数据,保证max(∣x∣,∣y∣)≤106;
对于全部数据,保证max(∣x∣,∣y∣)≤1012。

题解

  答案为gcd(abs(c-a), abs(d-b))-1,注意一下两个端点相同的情况。

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 typedef long long LL;
 5 LL a, b, c, d;
 6 LL gcd(LL a, LL b)
 7 {
 8     return b == 0 ? a : gcd(b, a%b);
 9 }
10 LL bas(LL x)
11 {
12     return x < 0 ? -x : x;
13 }
14 int main()
15 {
16     scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
17     LL ans = gcd(bas(c-a), bas(d-b))-1;
18     printf("%lld\n", max(ans, 0LL));
19     return 0;
20 }
View Code

 

posted @ 2020-05-21 21:16  Johnny-English  阅读(225)  评论(0编辑  收藏  举报