#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define fi first
#define se second
#define pb push_back
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define MOD 1000000007
#define N 3005
int fact[N], inv[N], pak2[N], invpak2[N], dp[N][N];
int sum(int a, int b){
a+=b;
if(a>=MOD) a-=MOD;
if(a<0) a+=MOD;
return a;
}
int mul(int a, int b){
return 1LL*a*b%MOD;
}
int poww(int n, int k){
int r=1;
while(k>0){
if(k&1) r=mul(r,n);
n=mul(n,n);
k>>=1;
}
return r;
}
int comb(int n, int k){
return mul(fact[n],mul(inv[k], inv[n-k]));
}
int main()
{
fastIO;
fact[0]=1;
for(int i=1; i<N; i++) fact[i]=mul(fact[i-1],i);
inv[N-1]=poww(fact[N-1],MOD-2);
for(int i=N-2; i>=0; i--) inv[i]=mul(i+1,inv[i+1]);
pak2[0]=1;
for(int i=1; i<N; i++) pak2[i]=mul(pak2[i-1],2);
invpak2[N-1]=poww(pak2[N-1],MOD-2);
for(int i=N-2; i>=0; i--) invpak2[i]=mul(2,invpak2[i+1]);
for(int i=0; i<N; i++){
dp[i][0]=1;
dp[0][i]=1;
}
for(int i=1; i<N; i++){
for(int j=1; j<N; j++){
dp[i][j]=sum(dp[i-1][j],mul(4,mul(j,dp[i-1][j-1])));
}
}
int n,m;
cin>>n>>m;
int r=0;
for(int vert=0; vert*2<=n && vert<=m; vert++){
int cvert=mul(mul(comb(m, vert),comb(n,vert*2)),mul(fact[vert*2],invpak2[vert]));
int newn=n-vert*2,newm=m-vert;
for(int hor=0; hor*2<=newm && hor<=newn; hor++){
int chor=mul(mul(comb(newn, hor),comb(newm,hor*2)),mul(fact[hor*2],invpak2[hor]));
r=sum(r,mul(cvert,mul(chor,dp[newn-hor][newm-hor*2])));
}
}
r=sum(r,-1);
cout<<r;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |