๐๋ฌธ์ ํ์ํ๊ธฐ
- ์นด์ ์ ๊ตญ ๋ฐฑ์ฑ๋ค์ M๊ณผ N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ ๊ฐ์ ์์ฐ์ x, y๋ฅผ ๊ฐ๊ณ ๊ฐ ๋
๋๋ฅผ <x:y> ํ์์ผ๋ก ํํ
- ์ฒซ ๋ฒ์งธ ํด๋ <1:1>, ๋ ๋ฒ์งธ ํด๋ <2:2>
- <x:y>์ ๋ค์ ํด๊ฐ <x':y'> ⇒ x < M์ด๋ฉด x' = x + 1์ด๊ณ , ์๋๋ฉด x' = 1 / y < N์ด๋ฉด y' = y + 1์ด๊ณ , ์๋๋ฉด y' = 1
- <M:N>์ ๋ฌ๋ ฅ์ ๋ง์ง๋ง ํด
- M, N, x, y๊ฐ ์ฃผ์ด์ง ๋, <x:y>๋ ๋ช ๋ฒ์งธ ํด๋ฅผ ๋ํ๋ด๋์ง ๊ตฌํ๊ธฐ
์ ๋ ฅ
- ์ ๋ ฅ ๋ฐ์ดํฐ์ ์๋ฅผ ๋ํ๋ด๋ ์ ์ T (ํฌ๊ธฐ ๋ช ์๋์ด ์์ง ์์)
- ๊ฐ ํ ์คํธ์ผ์ด์ค์ ๋ค ๊ฐ์ ์ ์ M, N, x, y๊ฐ ์ฃผ์ด์ง (1 ≤ M, N ≤ 40,000, 1 ≤ x ≤ M, 1 ≤ y ≤ N)
์ถ๋ ฅ
- ๊ฐ ํ ์คํธ ๋ฐ์ดํฐ์ ๋ํด <x:y>๊ฐ ๋ช ๋ฒ์งธ ํด์ธ์ง ๋ํ๋ด๋ ์ ์ k ์ถ๋ ฅ
- <x:y>๊ฐ ์ ํจํ์ง ์์ ํํ์ด๋ผ๋ฉด -1 ์ถ๋ ฅ
ํ์ด ๋ฐฉ๋ฒ ์๊ฐํด๋ณด๊ธฐ
์ ์์ ์ ๊ฐ์ด M, N์ด ์ฃผ์ด์ก์ ๋ ํํํ ์ ์๋ ๋ชจ๋ ํด์ ๊ฐ์๋ M๊ณผ N์ ์ต์๊ณต๋ฐฐ์์ ๊ฐ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๋ํ <x:y>๊ฐ ์ฃผ์ด์ง๋ฉด <x:a> ๋ค์์ผ๋ก <x:?> ํํ๊ฐ ๋๋ ํด๊ฐ ๋ฌด์จ ํด์ธ์ง a์ M์ ๋ํด ๊ตฌํ ์ ์๋ค. ๋ง์ฝ (a+M)์ด N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค๋ฉด <x:y>์ ๋ค์ ํด๋ <x:a+M>์ด ๋๋ค. ๋ง์ฝ (a+M)์ด N๋ณด๋ค ํฌ๋ค๋ฉด (a+M)%N์ด 0์ด๋ผ๋ฉด <x:1>, ์๋๋ผ๋ฉด <x:(a+M)%N>์ด ๋๋ค. ์ด ์ ์ ํ์ฉํ์ฌ ๋ชจ๋ <x:?>์ ๋ํด ๋ธ๋ฃจํธํฌ์ค ํ์ํ์ฌ <x,y>๋ฅผ ์ฐพ์์, ์ต์ข ์ ์ผ๋ก ๋ช ๋ฒ์งธ ํด์ธ์ง ๊ตฌํ ์ ์๋ค.
๐์ฝ๋ ์ค๊ณํ๊ธฐ
- ํ ์คํธ์ผ์ด์ค ๊ฐ์ T๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
- T๋ฒ๋งํผ ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- M, N, x, y๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
- ๊ฐ๋ฅํ ํด์ ํํ ์ค ๋ง์ง๋ง์ผ๋ก <x:?> ํํ์ธ ํด๋ฅผ ๊ตฌํ๊ธฐ ์ํด M๊ณผ N์ ์ต์๊ณต๋ฐฐ์๋ฅผ ๊ตฌํด max_count์ ํ ๋นํ๋ค.
- ํ์ฌ๊น์ง ํ์ธํ ํด์ ๊ฐ์๋ฅผ ์ ๋ณ์ count๋ฅผ x๋ก ์ด๊ธฐํํ๋ค.
- a๋ฅผ x๋ก ์ด๊ธฐํํ๋ค.
- count๊ฐ max_count๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋๊น์ง ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- a๊ฐ N๋ณด๋ค ํฌ๋ค๋ฉด, (a%N)์ ๊ณ์ฐํด์ 0์ด๋ผ๋ฉด a์ N์ ํ ๋นํ๊ณ , ์๋๋ผ๋ฉด a์ (a%N)์ ํ ๋นํ๋ค.
- a์ y๊ฐ ๊ฐ๋ค๋ฉด count๋ฅผ ์ถ๋ ฅํ๊ณ ํ์์ ์ข ๋ฃํ๋ค.
- a์ y๊ฐ ๋ค๋ฅด๋ค๋ฉด a์ M์ ๋ํ๊ณ , count์ N์ ๋ํ๋ค.
- ๋ชจ๋ ํ์์ด ๋๋๋ ์ผ์นํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ง ๋ชปํ๋ค๋ฉด -1๋ฅผ ์ถ๋ ฅํ๋ค.
๐์ ๋ต ์ฝ๋
Python
from math import gcd
import sys
input = sys.stdin.readline
for _ in range(int(input())):
M, N, x, y = map(int, input().split())
max_count = M*N//gcd(M,N)
count = x
a = x
while count <= max_count:
a = (a-1)%N+1
if a == y:
print(count)
break
a += M
count += M
else:
print(-1)
๐๊ฐ์ ํ๊ธฐ
์ ์ฝ๋๋ก AC๋ฅผ ๋ฐ๊ธด ํ์ง๋ง, 3920ms์ ์๊ฐ์ด ๊ฑธ๋ ค ์ข ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ์์๊น ์๊ฐํด๋ดค๋ค.
์ผ๋จ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด ์ฝ๋์์ a๋ x + kM
๊ผด๋ก ์ฆ๊ฐํ๋ฉด์ ๋งค๋ฒ N์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ ์ฉํ๊ณ ์๋ค, ๊ทธ๋ฆฌ๊ณ ์ด a๊ฐ y์ ๊ฐ์์ง๋ ์๊ฐ์ ์ฐพ๋๋ค. ํ์ง๋ง ๋งค๋ฒ a์ ๋ํด N์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ ํ์ ์์ด ๊ณ์ count๋ฅผ ๋์ ์ํค๊ณ ์ด count๋ฅผ ๋ฐํ์ผ๋ก y์ ๋น๊ตํ ๋๋ง ๋๋จธ์ง๋ฅผ ๊ตฌํด์ฃผ๋ฉด ๋๋ค. ์ฆ, count์ a๋ฅผ ๊ฐ์ ๋ณ์๋ก ๊ด๋ฆฌํ ์ ์๋ค.
์ด๋ฅผ ์์ผ๋ก ํํํ๋ฉด (x + kM)%N==y
๊ฐ ๋๊ณ , ์ด๋ฅผ ๋ง์กฑํ๋ k๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค. (x+kM)
์ N์ผ๋ก ๋๋ ๋๋จธ์ง๊ฐ y๊ฐ ๋๋ ์๊ฐ์ ์ฐพ๋๋ค๋ ๊ฒ์, (x+kM-y)
์ M์ผ๋ก ๋๋ ๋๋จธ์ง๊ฐ 0์ด ๋๋ ์๊ฐ์ ์ฐพ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ ์ฉํ์ฌ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ฐ์ ํ ์ ์๋ค.
from math import gcd
import sys
input = sys.stdin.readline
for _ in range(int(input())):
M, N, x, y = map(int, input().split())
max_count = M * N // gcd(M, N)
count = x
while count <= max_count:
if (count - y) % N == 0:
print(count)
break
count += M
else:
print(-1)
๋ฐฑ์ค์ ์ ์ถํ์ ๋ ๊ธฐ์กด ์ฝ๋์ ์คํ ์๊ฐ์ธ 3920ms์์ 2300ms๋ก ๊ฐ์ ๋์๋ค.