Submission #1151941

#TimeUsernameProblemLanguageResultExecution timeMemory
1151941pinbuTents (JOI18_tents)C++20
100 / 100
244 ms36056 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 3005;
const long long oo = 1e18;
const int MOD = 1e9 + 7;
void add(int &X, int Y) {
	if ((X += Y) >= MOD) X -= MOD;
}

int n, m;
int dp[N][N];
int DP(int h, int w) {
	if (!h || !w) return 1;
	int &T = dp[h][w];
	if (T >= 0) return T;
	
	T = 1LL * DP(h - 1, w - 1) * w * 4 % MOD;
	add(T, DP(h - 1, w));
	if (w > 1) add(T, 1LL * DP(h - 1, w - 2) * (w * (w - 1) / 2) % MOD);
	if (h > 1) add(T, 1LL * DP(h - 2, w - 1) * (h - 1) * w % MOD);
	return T;
}
void solve(void) {
	cin >> n >> m;
	memset(dp, -1, sizeof dp);
	int ans = DP(n, m) - 1;
	if (ans < 0) ans += MOD;
	cout << ans; 
}

signed main(void) {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    
    int TEST = 1; //cin >> TEST; 
    while (TEST--) solve();
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...