https://www.acmicpc.net/problem/6064
6064번: 카잉 달력
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 한 줄로 구성된다.
www.acmicpc.net


난이도: solved.ac 실버 1
중국인의 나머지 정리? 를 이용해서 푸는 거라던데, 유클리드 호제법도 잘 모르는 나는 그냥 내 식대로 풀어봤다.
<x, y>를 만들기 위해 먼저 <x, x>부터 시작해서 두 번째 자리에 있는 x를 y로 만드는 것을 목표로 했다.
예를 들어 예제 입력 1의 첫 번째 케이스처럼 m = 10, n = 12, x = 3, y = 9라면,
일단 <3, 3>부터 시작해서 앞자리가 3인 다음 경우를 생각해 보면 <3, 1>이 된다. 그 다음 앞자리가 3인 경우는 <3, 11>가 된다. 그 다음은 <3, 9>로 우리가 원하는 <3, 9>가 만들어진다.
예제 입력 1 두 번째 케이스인 m = 10, n = 12, x = 7, y = 2인 경우에는 어떨까?
우선 똑같이 <7, 7>부터 시작한다. <7, 7> → <7, 5> → <7, 3> → <7, 1> → <7, 11> → <7, 9> → <7, 7> → <7, 5> → ... 처럼 <7, 2>를 찾지 못하고 <7, 7>로 다시 돌아와 반복된다.
위처럼 다시 돌아와서 위의 과정이 무한히 반복되는 경우를 탈출하기 위해 해당 수에 방문했는지 체크하는 배열을 만들어 파악해 주었다.
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); int m, n, x, y, T; cin >> T; while (T--) { cin >> m >> n >> x >> y; int max = m; if (n > m) max = n; int* arr = new int[max + 1]{}; // x를 y로 만들기 int flag = 0, ans = x; arr[x] = 1; x = x % n; if (!x) x = n; while (x != y) { x = (x + m) % n; if (!x) x = n; ans += m; if (arr[x]) { flag = 1; break; } arr[x] = 1; } if (flag) cout << -1 << endl; else cout << ans << endl; delete[] arr; } }