#include<bits/stdc++.h>
#define rep(a,b,c) for(ll a=b;a<=c;++a)
#define ll long long
#define ff first
#define ss second
#define mp make_pair
using namespace std;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const ll N=3005,inf=1e18,mod=1e9+7;
ll n,m,dp[N][N],fac[N],inv[N];
ll fpow(ll a,ll b){
ll res=1;
while(b){
if(b&1) (res*=a)%=mod;
(a*=a)%=mod;
b>>=1;
}
return res;
}
void build(){
fac[0]=1;
rep(i,1,N-5) (fac[i]=fac[i-1]*i)%=mod;
inv[N-5]=fpow(fac[N-5],mod-2);
for(ll i=N-6;i>=0;--i) (inv[i]=inv[i+1]*(i+1))%=mod;
}
ll C(ll n,ll k)
{return fac[n]*inv[k]%mod*inv[n-k]%mod;}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>m;
build();
dp[0][0]=1;
rep(i,1,n) dp[i][0]=1;
rep(i,1,m) dp[0][i]=1;
rep(i,1,n){
rep(j,1,m){
dp[i][j]+=dp[i-1][j];
(dp[i][j]+=dp[i-1][j-1]*j*4)%=mod;
if(i>1) (dp[i][j]+=dp[i-2][j-1]*(i-1)*j)%=mod;
if(j>1) (dp[i][j]+=dp[i-1][j-2]*C(j,2))%=mod;
}
}
cout<<(dp[n][m]-1+mod)%mod<<'\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |