Submission #127860

#TimeUsernameProblemLanguageResultExecution timeMemory
127860dooweyTents (JOI18_tents)C++14
100 / 100
327 ms35960 KiB
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ld, ld> pdd;

#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const int N = 3005;
const int MOD = (int)1e9 + 7;

int mult(int a, int b){
    return (a * 1ll * b) % MOD;
}

void add(int &a, int b){
    a = (a + b) % MOD;
}

int dp[N][N];

int solve(int i, int j){
    if(dp[i][j] != -1) return dp[i][j];
    dp[i][j] = 0;
    if(i == 0 || j == 0){
        dp[i][j] = 1;
    }
    else{
        add(dp[i][j], solve(i - 1, j));
        add(dp[i][j], mult(4 * j, solve(i - 1, j - 1)));
        if(j > 1) add(dp[i][j], mult(j * (j - 1) / 2, solve(i - 1, j - 2)));
        if(i > 1) add(dp[i][j], mult(mult(j, (i - 1)), solve(i - 2, j - 1)));
    }
    return dp[i][j];
}

int main(){
    fastIO;
    int n, m;
    cin >> n >> m;
    for(int i = 0 ; i <= n; i ++ ){
        for(int j = 0 ; j <= m ; j ++ ){
            dp[i][j] = -1;
        }
    }
    cout << (solve(n, m) - 1 + MOD) % MOD;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...