#include <bits/stdc++.h>
using namespace std;;
#define ll long long
#define ar array
#define ld double
#define int long long
#define all(v) v.begin(), v.end()
// #pragma GCC optimize("O3,Ofast,unroll-loops ")
const int N = 3010;
const int M = 20;
const int LOG = 20;
const int INF = 1e17;
int MOD = 1e9 + 7;
const ld EPS = 1e-12;
template<typename T>
inline void chmin(T &x,T y){x = min(x, y);}
template<typename T>
inline void chmax(T &x,T y){x = max(x, y);}
inline void mm(int &x){x = (x % MOD + MOD) % MOD;};
int n, m;
int dp[N][N];
int f(int i,int j){
if(i <= 0 || j <= 0)return 1;
if(dp[i][j] != -1)return dp[i][j];
int res = 0;
mm(res += f(i - 1, j));
mm(res += f(i - 1, j - 2) * j * (j - 1) / 2);
mm(res += f(i - 1, j - 1) * 4 * j);
mm(res += f(i - 2, j - 1) * (i - 1) * j);
return dp[i][j] = res;
}
void orz(){
cin>>n>>m;
memset(dp, -1, sizeof dp);
cout<<f(n, m) - 1<<'\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin>>t;
while (t--)orz();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |