제출 #1335711

#제출 시각아이디문제언어결과실행 시간메모리
1335711mamabearLego Wall (EGOI22_legowall)C++20
62 / 100
3094 ms6212 KiB
#include <iostream>
#include <vector>

using namespace std;

const int MOD = 1000000007;

long long power(long long base, long long exp) {
    long long res = 1;
    base %= MOD;
    while (exp > 0) {
        if (exp % 2 == 1) res = (res * base) % MOD;
        base = (base * base) % MOD;
        exp /= 2;
    }
    return res;
}

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

    int w, h;
    if (!(cin >> w >> h)) return 0;

    vector<long long> row(w + 1, 0);
    row[0] = 1;
    if (w >= 1) row[1] = 1;
    for (int i = 2; i <= w; i++) {
        row[i] = (row[i - 1] + row[i - 2]) % MOD;
    }

    vector<long long> total(w + 1, 0);
    for (int i = 1; i <= w; i++) {
        total[i] = power(row[i], h);
    }

    vector<long long> dp(w + 1, 0);
    if (w >= 1) dp[1] = total[1];
    
    for (int i = 2; i <= w; i++) {
        long long bad_walls = 0;
        
        for (int j = 1; j < i; j++) {
            long long split_ways = (dp[j] * total[i - j]) % MOD;
            bad_walls = (bad_walls + split_ways) % MOD;
        }
        
        dp[i] = (total[i] - bad_walls + MOD) % MOD; 
    }

    cout << dp[w] << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...