건너 뛰며 해보기
- 문제의 정답을 구하기 위해서 모든 경우의 수를 살펴봐야 하는 건 맞지만,
- 어떤 특정한 경우는 정답이 안나오기 때문에, 굳이 경우의 수로 시도해볼 필요가 없는 경우를 말한다.
- M,N,x,y가 주어졌으 때,
<x:y>
이 몇 번째 해인지 구하는 문제 - 그런데, 이 문제도 날짜계산 문제처럼 다 만들어야 할까?
- 1 <= M,N <= 40,000
-
전체 경우의 수는 16억 가지라서 너무 많다.
- 각각의 주기가 존재한다, 5와 7이라는.
- 모든 수에서 1만큼만 빼보자.
- 그러면 x,y를 쉽게 구할 수 있다.
- 0,1,2,3,4가 반복되기 때문이다.
-
23 % 5, 23%7 을 하면 3,2가 나오게 된다.
- x=3, y=2라면, 정답은 <3,2>가 나와야 한다.
- 모든 정답이 될 수 있는 후보는 5로 나눈 나머지가 3이 나와야 한다.
-
첫 번째 3부터 계속 n씩 증가하면서, 정답을 비교해보면 된다. y가 같은지.
- x를 이용해 모든 고려하지 않고, ix(M+x)(i>=0)
-
M으로 나눈 나머지가 x인 모든 연도에 대해서만 조사를 하면 된다.
- 이 방법이 가능한 이유는, x를 고정했으면, 가능한 y는 n개 밖에 없기 때문이다.
- 조사해봐야 하는 연도는 최대 n개만 나오게 된다.
t = int(input())
for _ in range(t):
m,n,x,y = map(int,input().split())
x -= 1
y -= 1
k = x
while k < n*m:
if k%n == y:
print(k+1)
break
k += m
else:
print(-1)
참고자료 codeplus