PS

BOJ 12438 : 새로운 달력 (Large)

lickelon 2024. 3. 11. 23:39
  • 문제 링크 : boj.kr/12438
  • 난이도 : G5
  • 태그 : 정수론
 

12438번: 새로운 달력 (Large)

태양계 밖에서 새로 발견된 행성 ELG8-G는 지구와는 다른 자전/공전주기를 가지고 있어서 지구의 달력을 그대로 가져다 쓸 수 없다. 이에 과학자들은 이 행성을 위해 새로운 달력 시스템을 만들기

www.acmicpc.net


코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

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

    int T;
    cin >> T;
    for(int i = 0; i < T; i++) {
        ll tm, md, wd;
        cin >> tm >> md >> wd;

        ll mc = 0;
        ll left = 0;
        ll mw = 0;
        vector<ll> arr(1);
        mc = 1;
        left = md % wd;
        mw = md / wd;
        mw += (left ? 1 : 0);
        arr.emplace_back(mw);
        while(left) {
            ll temp = md;
            temp += left;

            mc += 1;
            left = temp % wd;
            mw += temp / wd;
            mw += (left ? 1 : 0);
            arr.emplace_back(mw);
        }
        ll ans = 0;
        ans += (tm / mc) * mw;
        ans += arr[tm%mc];

        cout << "Case #" << i+1 <<": " << ans << "\n";
    }

    return 0;
}

풀이

여러 달이 반복되다가 마지막에 어떤 달의 마지막 주가 전부 차있게 되는 한 더미를 주기라고 하자.

이때 한 주기의 길이는 주당 일수와 월당 일수의 최대 공약수이므로 주당 일수를 넘지 않는다.

따라서 O(주당 일수)로 한 주기의 정보(길이, 각 월별 주의 개수)를 구할 수 있고, 총 월 수를 주기로 나누어 주어 답을 구할 수 있다.

'PS' 카테고리의 다른 글

BOJ 20158 : 사장님 달려가고 있습니다  (0) 2024.03.13
BOJ 2175 : 땅 자르기  (0) 2024.03.12
BOJ 2187 : 점 고르기  (0) 2024.03.10
BOJ 1885 : 비부분수열  (0) 2024.03.09
BOJ 1846 : 장기  (0) 2024.03.08