알고리즘/BaekJoon

백준 6064 : 카잉 달력

꾸준하게 :) 2020. 2. 29. 10:32

문제 링크입니다 https://www.acmicpc.net/problem/6064

 

6064번: 카잉 달력

문제 최근에 ICPC 탐사대는 남아메리카의 잉카 제국이 놀라운 문명을 지닌 카잉 제국을 토대로 하여 세워졌다는 사실을 발견했다. 카잉 제국의 백성들은 특이한 달력을 사용한 것으로 알려져 있다. 그들은 M과 N보다 작거나 같은 두 개의 자연수 x, y를 가지고 각 년도를 와 같은 형식으로 표현하였다. 그들은 이 세상의 시초에 해당하는 첫 번째 해를 <1:1>로 표현하고, 두 번째 해를 <2:2>로 표현하였다. 의 다음 해를 표현한 것을 이라고 하자. 만일

www.acmicpc.net

문제에서는 각 년도를 <x:y>와 같은 형식으로 표현하고, 첫 번째 해를 <1:1>, 두 번째 해를 <2:2>로 표현합니다. <x:y>의 다음 해를 표현한 것을 <x':y'>라 할 때, x < M이면 x'=x+1이고, 그렇지 않으면 x'=1입니다.

 

즉, x는 M과 같아지면 1이 되고, y는 N과 같아지면 1이 됩니다. 네 개의 정수 M, N, x, y가 주어질 때, <M:N>이 마지막 해라고 하면 <x:y>는 몇 번째 해를 나타내는지 구하는 문제였습니다.

 

모든 경우를 다 해보기에는 N과 M의 범위가 너무 커서 x를 고정시켜놓고 문제를 해결했습니다. 

 

[소스코드]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<cstdio>
 
int tc, m, n, x, y;
 
int solve(void) {
    // x와 y를 1씩 감소시키면 i번째 해를 M으로 나눈 나머지는 x,
    // N으로 나눈 나머지는 y를 만족하게 됩니다
    x -= 1, y -= 1;
 
    // i를 x부터 m씩 더해나갑니다(i를 x로 나눈 나머지는 m)
    for (int i = x; i <= n * m; i += m) {
 
        // 그 i를 n으로 나눈 나머지도 y를 만족하면
        if (i % n == y) return i + 1;
    }
    return -1;
}
 
int main(void) {
 
    scanf("%d"&tc);
    for (int t = 0; t < tc; t++) {
        scanf("%d%d%d%d"&m, &n, &x, &y);
        printf("%d\n", solve());
    }
    return 0;
}
cs