2 min read

λ°±μ€€ 17297번 Messi Gimossi

문제 링크

MM이 μ΅œλŒ€ 230βˆ’12^{30}-1μ΄λ―€λ‘œ 완전탐색을 돌릴 순 μ—†λ‹€. messi(N)messi(N)은 messi(Nβˆ’1)messi(N-1) 뒀에 messi(Nβˆ’2)messi(N-2)λ₯Ό 이어 뢙인 λ¬Έμžμ—΄μ΄λ‹€. λ”°λΌμ„œ μ£Όμ–΄μ§„ mm보닀 큰 messi(N)messi(N)을 μ°Ύκ³ , MM번째 κΈ€μžκ°€ messi(Nβˆ’1)messi(N-1)에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ messi(Nβˆ’2)messi(N-2)에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. κ·Έλ ‡κ²Œ MMκ³Ό NN을 쀄여 λ‚˜κ°ˆ 수 μžˆλ‹€. 곡백을 λ§Œλ‚˜λ©΄ 좜λ ₯ν•˜κ³  λ°”λ‘œ μ’…λ£Œν•œλ‹€.

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

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

    ll m;
    cin >> m;

    vector<ll> messi = {5, 13};

    for (int i = 2; i < 50; i++) {
        ll next = messi[i-1] + messi[i-2] + 1;
        messi.emplace_back(next);
    }

    int idx = lower_bound(messi.begin(), messi.end(), m) - messi.begin();

    while (idx != 0 && idx != 1) {
        if (m <= messi[idx-1]) {
            idx--;
        }
        else if (m == messi[idx-1] + 1) {
            cout << "Messi Messi Gimossi\n";
            return 0;
        }
        else {
            m -= (messi[idx-1] + 1);
            idx -= 2;
        }
    }

    string s = "Messi Gimossi";
    m--;
    char c = s[m];
    if (c == ' ') cout << "Messi Messi Gimossi\n";
    else cout << c << '\n';

    return 0;
}

λ©”μ‹œμ˜ 2022 μ›”λ“œμ»΅ μš°μŠΉμ„ μΆ•ν•˜ν•©λ‹ˆλ‹€.