Submission #110096

#TimeUsernameProblemLanguageResultExecution timeMemory
110096SaboonTents (JOI18_tents)C++14
100 / 100
197 ms35728 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int maxn = 3000 + 10;
const int mod = 1e9 + 7;
int dp[maxn][maxn];

int power(int a, int b){
	if (b == 0)
		return 1;
	int ret = power(a, b / 2);
	ret = 1ll * ret * ret % mod;
	if (b & 1)
		return 1ll * ret * a % mod;
	return ret;
}

int main(){
	ios_base::sync_with_stdio(false);
	int n, m;
	cin >> n >> m;
	for (int i = 0; i <= max(n, m); i++)
		dp[i][0] = dp[0][i] = 1;
	int pw = power(2, mod - 2);
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= m; j++){
			if (i == 1){
				dp[i][j] = 4 * j + 1ll * j * (j - 1) % mod * pw % mod + 1;
				dp[i][j] %= mod;
				continue;
			}
			if (j == 1){
				dp[i][j] = 4 * i + 1ll * i * (i - 1) % mod * pw % mod + 1;
				dp[i][j] %= mod;
				continue;
			}
			dp[i][j] = dp[i - 1][j];
			dp[i][j] = (dp[i][j] + 4ll * dp[i - 1][j - 1] * j) % mod;
			dp[i][j] = (dp[i][j] + 1ll * dp[i - 1][j - 2] * j % mod * (j - 1) % mod * pw % mod) % mod;
			dp[i][j] = (dp[i][j] + 1ll * dp[i - 2][j - 1] * j % mod * (i - 1) % mod) % mod;
		}
	}
	cout << (dp[n][m] - 1 + mod) % mod << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...