백준/실버

[백준 32981번] 찐 Even Number (C++)

게임개발기원 2025. 6. 4. 05:50

문제링크 : https://www.acmicpc.net/problem/32981

#include <bits/stdc++.h>
using namespace std;

const int MOD = 1000000007;

long long cal(long long base, long long exp, int mod) {
    long long result = 1;
    long long cur = base % mod;
    while (exp > 0) 
    {
        if (exp%2) result = (result * cur) % mod;
        cur = (cur * cur) % mod;
        exp /=2;
    }
    return result;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int Q; 
    cin >> Q;
    while(Q--) 
    {
        int N; cin >> N;
        long long ans = 0;
        if (N == 1) ans = 5;
        else ans = (4 * cal(5, N - 1, MOD)) % MOD;
        cout << ans << "\n";
    }

    return 0;
}

 

N=1의 경우 0도 가능하기에 총 5가지이다.

N=2 이후 부터는 맨 앞에 0이 불가능하므로 맨 앞은 4가지가 가능하다.

이후 자릿수에 대해서는 모두 가능하기에 5가지이다.

따라서 이를 식으로 표현하면 4 * pow(5, N-1)이다.

 

다만, 이를 그대로 적용하면 시간초과가 걸린다.

따라서 해당 식은 분할정복을 이용한 거듭제곱을 통한 계산으로 빠르게 처리해주어야 한다.