Codeforces-1142A-The Beetles(GCD)

原题链接:http://codeforces.com/problemset/problem/1142/A

题目原文:

 

A. The Beatles

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Recently a Golden Circle of Beetlovers was found in Byteland. It is a circle route going through n⋅kn⋅k cities. The cities are numerated from 11to n⋅kn⋅k, the distance between the neighboring cities is exactly 11 km.

Sergey does not like beetles, he loves burgers. Fortunately for him, there are nn fast food restaurants on the circle, they are located in the 11-st, the (k+1)(k+1)-st, the (2k+1)(2k+1)-st, and so on, the ((n−1)k+1)((n−1)k+1)-st cities, i.e. the distance between the neighboring cities with fast food restaurants is kk km.

Sergey began his journey at some city ss and traveled along the circle, making stops at cities each ll km (l>0l>0), until he stopped in ss once again. Sergey then forgot numbers ss and ll, but he remembers that the distance from the city ss to the nearest fast food restaurant was aakm, and the distance from the city he stopped at after traveling the first ll km from ss to the nearest fast food restaurant was bb km. Sergey always traveled in the same direction along the circle, but when he calculated distances to the restaurants, he considered both directions.

Now Sergey is interested in two integers. The first integer xx is the minimum number of stops (excluding the first) Sergey could have done before returning to ss. The second integer yy is the maximum number of stops (excluding the first) Sergey could have done before returning to ss.

Input

The first line contains two integers nn and kk (1≤n,k≤1000001≤n,k≤100000) — the number of fast food restaurants on the circle and the distance between the neighboring restaurants, respectively.

The second line contains two integers aa and bb (0≤a,b≤k20≤a,b≤k2) — the distances to the nearest fast food restaurants from the initial city and from the city Sergey made the first stop at, respectively.

Output

Print the two integers xx and yy.

Examples

input

Copy

2 3
1 1

output

Copy

1 6

input

Copy

3 2
0 0

output

Copy

1 3

input

Copy

1 10
5 3

output

Copy

5 5

Note

In the first example the restaurants are located in the cities 11 and 44, the initial city ss could be 22, 33, 55, or 66. The next city Sergey stopped at could also be at cities 2,3,5,62,3,5,6. Let's loop through all possible combinations of these cities. If both ss and the city of the first stop are at the city 22 (for example, l=6l=6), then Sergey is at ss after the first stop already, so x=1x=1. In other pairs Sergey needs 1,2,31,2,3, or 66 stops to return to ss, so y=6y=6.

In the second example Sergey was at cities with fast food restaurant both initially and after the first stop, so ll is 22, 44, or 66. Thus x=1x=1, y=3y=3.

In the third example there is only one restaurant, so the possible locations of ss and the first stop are: (6,8)(6,8) and (6,4)(6,4). For the first option l=2l=2, for the second l=8l=8. In both cases Sergey needs x=y=5x=y=5 stops to go to ss.

 题目大意:

        给一个 k * n 节点的圆环,每隔 k 有一个快餐店,从某一点 s 出发,每次都移动 l 距离,多次移动后最终还能回到原点 s 为一次完整旅行。距离s点最近的快餐店距离为a,距离 s + l 点最近的快餐店距离为 b,问旅行一次最少的移动次数 x 和最多的移动次数 y。

解题思路:

        遍历可能的 l ,a + l + b = k * i, a + l - b = k * i, i为自然数;l * x = k * n * i, i为自然数;那么可以看出 x = LCD(l, k * n) / l = k * n / GCD(l , k * n). 注意 l 的遍历方式,以减少循环计算次数,注意整数计算越界。遍历过程中,记录x的最大最小值就是答案。

AC代码:

#include <cstdio>
#include <algorithm>
using namespace std;

typedef long long Long;

const long long INF = 0x3f3f3f3f3f3f3f3fLL;

Long gcd(Long a, Long b)
{
	return b == 0 ? a : gcd(b, a % b);
}

Long lcm(Long a, Long b)
{
	return a / gcd(a, b) * b;
}

int main()
{
	Long n, k, a, b, l, maxv, minv, s;
	while (scanf("%I64d %I64d %I64d %I64d", &n, &k, &a, &b) != EOF)
	{
		maxv = -INF;
		minv = INF;
		// for (l = 1; l <= k * n * 2; l += k)
		// {
		// 	if ((l + a + b) % k == 0 || (l + a - b) % k == 0)
		// 	{
		// 		Long t = lcm(l, k * n) / l;
		// 		maxv = max(maxv, t);
		// 		minv = min(minv, t);
		// 	}
		// }
		s = 1LL;
		while ((s + a + b) % k != 0) s++;
		for (l = s; l <= k * n * 2; l += k)
		{
			Long t = k * n / gcd(l, k * n);
			maxv = max(maxv, t);
			minv = min(minv, t);
		}
		s = 1LL;
		while ((s + a - b) % k != 0) s++;
		for (l = s; l <= k * n * 2; l += k)
		{
			Long t = k * n / gcd(l, k * n);
			maxv = max(maxv, t);
			minv = min(minv, t);
		}
		printf("%I64d %I64d\n", minv, maxv);
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值