Submission #1329852

#TimeUsernameProblemLanguageResultExecution timeMemory
1329852model_codeLego Wall (EGOI22_legowall)C++20
100 / 100
240 ms2392 KiB
#include <iostream>
#include <vector>

using namespace std;
using ll = long long;

constexpr int MOD = 1e9+7;

int main() {
    int W, H; cin >> W >> H;
    if (W <= H) {
        // O(w^2 * h)
        vector<int> All(W+1, 0), Disconnected(W+1, 0), Connected(W+1, 0);
        All[0] = All[1] = Connected[0] = Connected[1] = 1;
        for (int i = 2; i <= W; ++i) All[i] = (All[i-1] + All[i-2]) % MOD;
        for (int i = 2; i <= W; ++i) {
            ll pw = 1;
            for (int j = 0; j < H; ++j) ( pw *= All[i] ) %= MOD;
            All[i] = pw;

            for (int j = 1; j < i; ++j) ( Disconnected[i] += 1LL * Connected[j] * All[i-j] % MOD ) %= MOD;
            Connected[i] = ( All[i] - Disconnected[i] + MOD ) % MOD;
        }

        cout << Connected[W] << '\n';
    } else {
        // O (w * h^2)
        vector<vector<int>> C(H+1, vector<int>(H+1, 0));
        for (int i = 0; i <= H; i++) {
            C[i][0] = C[i][i] = 1;
            for (int j = 1; j < i; ++j) C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD;
        }

        vector<ll> D(H+1, 0), E(H+1, 0);
        for (int i = 1; i <= H; i++) D[i] = C[H][i];
        for (int a = 0; a < W-2; a++) {
            E.assign(H+1, 0);
            for (int i = 1; i < H; i++) {
                for (int j = 1; i+j <= H; j++) {
                    E[j] += D[i] * ll(C[H-i][j]) % MOD;
                }
            }
            for (int i = 0; i <= H; i++) E[i] %= MOD;
            swap(E, D);
        }
        ll ans = 0;
        for (int i = 0; i <= H; i++) ans += D[i];
        cout << (ans % MOD) << '\n';
    }
}

#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...