티스토리 뷰

DP[n] : n번째 징검다리를 건널때 나올 수 있는 경우의 수 라고 잡아보면

DP[n] = DP[n-1]+DP[n-2]+...+DP[1] 이라는 식이 나오는데

DP[n-1] = DP[n-2]+DP[n-3]+...+DP[1]

DP[n-2] = DP[n-3]+DP[n-4]+...+DP[1]

                         .

                         .

                         .

DP[1] = 1

이제 DP[1]부터 DP[n-1]을 DP[n]의 식에 대입해 보면

DP[n] = 2(DP[n-2]+DP[n-3]+...+DP[1]) = 2^2(DP[n-3]+DP[n-4]+...+DP[1]) = 2^3(DP[n-4]+DP[n-5]+...+DP[1])... =2^(n-2)DP[1] 가 나옵니다.

DP[1] = 1 이기 때문에 답은 2^(n-2) 가 됩니다.

각 테스트 케이스마다 2^(n-2)를 구해주면 되지만 계속 2씩 곱하면 n이 최대 10억이기 때문에 시간이 터지게 됩니다. 그래서 분할정복으로 O(logN) 만에 구해야 합니다.

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mpow(int x) {
    if(!x) return 1;
    ll tmp = mpow(x/2);
    return (tmp*tmp*(x % 2+1)) % 1000000007;
}
int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);
    int n,T;
    cin >> T;
    while(T--) {
        cin >> n;
        if(n == 1) cout << 1 << '\n';
        else cout << mpow(n-2) << '\n';
    }
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함