[BaekJoon] 백준 6064번 : 카잉 달력

Updated:

6064번 : 카잉 달력

Kaing


이 문제도 정말 수학 문제..

우선 N 이 M 보다 큰 경우에 y 와 x 값도 서로 바꾸고 M 과 N 의 위치도 서로 바꾸었다.

그래서 무조건 M >= N 인 경우로 만들어 풀도록 했다.

이렇게 한 뒤 규칙을 계속 보면 y 값이 계속 반복이 된다.

예를 들어 M = 13, N = 11 에서 <5, 6> 이 몇 번째 해 인지 찾아본다면

첫 번째 5가 들어가는 해는 <5, 5> 이고 다음 해는 <5, 7>, <5, 9>, <5, 11>, <5, 2> ..

M - N 만큼 y 값을 더해주고 N 으로 나머지 계산을 해주면 규칙적으로 y 값이 늘어나게 된다.

이 과정을 반복하면서 찾고자 하는 해를 찾아가면 된다.

그리고 만약 종말의 해를 넘어간다면 표현될 수 없는 해 이기 때문에 -1을 출력하면 된다.


import sys
from math import gcd


def find_LMC(M, N):
	_gcd = gcd(M, N)
	return _gcd * (M // _gcd) * (N // _gcd)


def find_kaing(M, N, x, y):
	if M < N:
		M, N = N, M
		x, y = y, x

	start = x % N
	if start == 0:
		start = N

	cnt = 0
	while start != y:
		start += M - N
		start %= N
		if start == 0:
			start = N
		cnt += 1

		if M * cnt > find_LMC(M, N):
			return -1

	return M * cnt + x


T = int(input())
for _ in range(T):
	in_M, in_N, in_x, in_y = map(int, sys.stdin.readline().rsplit())
	print(find_kaing(in_M, in_N, in_x, in_y))



Categories:

Updated:

Leave a comment