Codeforces Round #549 (Div. 2) ——D.The Beatles

链接:http://codeforces.com/contest/1143/problem/D

内容:

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 x and y.

Examples

input

扫描二维码关注公众号,回复: 8846639 查看本文章
2 3
1 1

output

1 6

input

3 2
0 0

output

1 3

input

1 10
5 3

output

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.

题意:

有n*k个首尾相连的城市,其中第1,k+1,2k+1,...,(n-1)k+1个城市有饭店,你从城市s出发,每次向前走l步,直到返回原来位置。定义a为开始时你离最近饭店的距离,b为走了一次之后离最近饭店的距离。输入n,k,a,b,输出最少走多少次返回原来位置、最多走多少次返回原来位置。

题解:

题目乍看有些啰嗦,其实不是很难。

首先根据输入a,b,明确l所要满足的条件。这里我分为以下四类(其中q为整数):

l=qk-a-bl=qk-a+bl=qk+a-bl=qk+a+b

q最多到n,可以考虑穷举。

之后就是计算共走了多少次:

r=n*k/gcd(n*k,l)

x=min(r)y=max(r)

代码:

#include <bits/stdc++.h>
#define maxn 100010
#define ll long long
using namespace std;
ll n,k,a,b; 
ll x,y;

ll gcd(ll u,ll v){
	if(v==0)return u;
	else return gcd(v,u%v);
}

int main(){
	cin>>n>>k;
	cin>>a>>b;
	x=n*k;
	y=0;
	for(ll q=0;q<=n;q++){
		ll l,r;
		l=q*k-a-b;
		if(l>0){
			r=n*k/gcd(n*k,l);
			x=min(x,r);
			y=max(y,r);
		}
		l=q*k-a+b;
		if(l>0){
			r=n*k/gcd(n*k,l);
			x=min(x,r);
			y=max(y,r);
		}
		l=q*k+a-b;
		if(l>0){
			r=n*k/gcd(n*k,l);
			x=min(x,r);
			y=max(y,r);
		}
		l=q*k+a+b;
		if(l>0){
			r=n*k/gcd(n*k,l);
			x=min(x,r);
			y=max(y,r);
		}
	}
	cout<<x<<" "<<y;
	return 0;
}

 
发布了27 篇原创文章 · 获赞 11 · 访问量 3606

猜你喜欢

转载自blog.csdn.net/Megurine_Luka_/article/details/89044029