HyeLog

6064_카잉 달력 본문

알고리즘

6064_카잉 달력

shj718 2023. 1. 5. 15:56

주기 M을 이용해서 후보 년도를 만든 다음, 주기 N에 대한 조건도 만족하는지 검사했다. (처음에 1번째 해부터 1씩 증가시키면서 M, N 조건을 검사하는 방식으로 풀었더니 시간초과가 떠서 이렇게 수정했다.)

 

마지막 해는 x, y의 최소공배수이다. 최소공배수는 '두 수의 곱 / 최대공약수' 이다. 최대공약수는 유클리드 호제법을 이용해서 구한다.


y == n 인 경우에 대한 예외 처리도 해주었다.

#include <iostream>

using namespace std;

int get_gcd(int a, int b) {
    int c;
    while (b)
    {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}

int get_lcm(int a, int b) {
    int gcd = get_gcd(a, b);
    return a * b / gcd;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int t;
    int m, n, x, y;
    cin >> t;
    while (t--) {
        cin >> m >> n >> x >> y;
        int lastYear = get_lcm(m, n);
        int k = -1;
        int i = 0, tmp;
        while (1) {
            tmp = m * i + x;
            if (tmp > lastYear) break;
            if ((tmp - 1) % n + 1 == y) {
                k = tmp;
            }
            i++;
        }
        cout << k << '\n';
    }

    return 0;
}

'알고리즘' 카테고리의 다른 글

우선순위 큐, Pair, 최소힙, 최대힙  (0) 2023.02.01
C++ 1차원, 2차원 배열 초기화 방법 (fill)  (2) 2023.01.31
9095_1, 2, 3 더하기  (0) 2023.01.05
1748_수 이어 쓰기 1  (0) 2023.01.05
14500_테트로미노  (2) 2023.01.04