BOJ

백준 6064 - 카잉 달력

yanJuicy 2020. 3. 9. 17:11
반응형

문제

 

https://www.acmicpc.net/problem/6064

 

6064번: 카잉 달력

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

www.acmicpc.net

 

 

풀이

 

브루트포스로 해결하면 시간초과가 발생한다. 먼저 x를 맞춰주고 그 후에 y를 찾아줘야 한다. 

1. x는 M만큼 증가를 한다. 따라서 x = x + M이 된다.

2. y는 x에서 N을 나눴을 때 나머지 값이 된다. 따라서 y = x % N이 된다. 하지만 x가 1부터 초기화가 되고 나머지 연산은 0부터 시작되기 때문에 y = (x-1)%N + 1이 된다.

 

이 과정은 달력의 마지막 날 까지 가능한데, 달력의 마지막 날은 M과 N의 최소공배수 값이 된다. 따라서 x 값이 마지막 날을 넘어가면 -1을 출력하면 된다.

 

 

코드

 

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
using namespace std;
 
int T;
 
int gcd(int a, int b)
{
    while (b)
    {
        int r = a % b;
        a = b;
        b = r;
    }   
    return a;
}
 
int lcm(int a, int b)
{
    return a * b / gcd(a, b);
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> T;
 
    int M, N, x, y;
    while (T--)
    {
        cin >> M >> N >> x >> y;
        int result = x;
        int max = lcm(M, N);
        int t;
        do
        {
            t = (result - 1) % N + 1;
            if (t == y) break;
            result += M;
        } while (result <= max);
        cout << (result < max ? result : -1<< '\n';
    }
 
    return 0;
}
cs

 

반응형

'BOJ' 카테고리의 다른 글

백준 1080 - 행렬  (0) 2020.03.22
백준 1377 - 버블 소트  (0) 2020.03.10
백준 1783 - 병든 나이트  (0) 2020.03.06
백준 2225 - 합분해  (0) 2020.03.05
백준 11048 - 이동하기  (0) 2020.03.04