제출 #1324273

#제출 시각아이디문제언어결과실행 시간메모리
1324273sh_qaxxorov_571Tents (JOI18_tents)C++20
100 / 100
82 ms70864 KiB
#include <iostream>
#include <vector>

using namespace std;

/**
 * JOI 2017/2018 Spring Training Camp - Tents
 * Dinamik dasturlash O(H*W)
 */

long long dp[3005][3005];
const int MOD = 1000000007;

int main() {
    int H, W;
    cin >> H >> W;

    // Baza holati: 0 ta qator yoki 0 ta ustun bo'lsa, 1 ta usul (bo'sh holat)
    for (int j = 0; j <= W; j++) dp[0][j] = 1;
    for (int i = 0; i <= H; i++) dp[i][0] = 1;

    for (int i = 1; i <= H; i++) {
        for (int j = 1; j <= W; j++) {
            // 1. Birinchi qator bo'sh
            dp[i][j] = dp[i-1][j];

            // 2. Birinchi qatorda 1 ta chodir (4 yo'nalishdan biri)
            dp[i][j] = (dp[i][j] + 4LL * j * dp[i-1][j-1]) % MOD;

            // 3. Birinchi qatorda 2 ta chodir (Sharq-G'arb juftligi)
            if (j >= 2) {
                long long combinations = (1LL * j * (j - 1) / 2) % MOD;
                dp[i][j] = (dp[i][j] + combinations * dp[i-1][j-2]) % MOD;
            }

            // 4. Birinchi qatordagi chodir boshqa bir qatordagi bilan juftlashgan (Shimol-Janub)
            if (i >= 2) {
                long long row_col_choices = (1LL * j * (i - 1)) % MOD;
                dp[i][j] = (dp[i][j] + row_col_choices * dp[i-2][j-1]) % MOD;
            }
        }
    }

    // Natija: kamida bitta chodir bo'lishi kerak, shuning uchun bo'sh holatni (1) ayiramiz
    long long result = (dp[H][W] - 1 + MOD) % MOD;
    cout << result << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...