Submission #612776

#TimeUsernameProblemLanguageResultExecution timeMemory
612776stevancvTents (JOI18_tents)C++14
100 / 100
599 ms40668 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sp ' '
#define en '\n'
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
using namespace std;
const int N = 3e3 + 2;
const int mod = 1e9 + 7;
int Add(int a, int b) {
    a += b;
    if (a >= mod) a -= mod;
    if (a < 0) a += mod;
    return a;
}
int Mul(int a, int b) {
    ll c = a; c *= b; c %= mod;
    return c;
}
bool was[N][N];
int dp[N][N];
int Solve(int a, int b) {
    if (a <= 0 || b <= 0) return 1;
    if (a == 1 && b == 1) return 5;
    if (was[a][b]) return dp[a][b];
    was[a][b] = 1;
    int ans = Solve(a - 1, b);
    ll k = 4 * b;
    ans = Add(ans, Mul(Solve(a - 1, b - 1), k));
    k = b * (b - 1) / 2;
    ans = Add(ans, Mul(Solve(a - 1, b - 2), k));
    k = (a - 1) * b;
    ans = Add(ans, Mul(Solve(a - 2, b - 1), k));
    return dp[a][b] = ans;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int h, w; cin >> h >> w;
    cout << Add(Solve(h, w), -1) << en;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...