#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
void speed()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
const long long int mod=1e9+7;
long long int n,m,dp[3005][3005],c[3005][3005],fac[3005];
long long int step(long long int base,long long int pow)
{
long long int z=base;
base=1;
for(long long int i=0;i<=30;i++)
{
if(pow&(1<<i))
{
base*=z;
base=base%mod;
}
z*=z;
z=z%mod;
}
return base;
}
void prec()
{
fac[0]=1;
fac[1]=1;
for(int i=2;i<=3000;i++)
{
fac[i]=(fac[i-1]*i)%mod;
}
for(int i=2;i<=3000;i++)
{
for(int j=2;j<=2;j++)
{
c[i][j]=(fac[i]*step((fac[j]*fac[i-j])%mod,mod-2))%mod;
}
}
}
void read()
{
cin>>n>>m;
prec();
dp[n][m]=1;
long long int otg=0;
for(int i=n;i>=0;i--)
{
for(int j=m;j>=0;j--)
{
if(i)
{
dp[i-1][j]+=dp[i][j];
dp[i-1][j]=dp[i-1][j]%mod;
}
if(i&&j)
{
dp[i-1][j-1]+=dp[i][j]*4*j;
dp[i-1][j-1]=dp[i-1][j-1]%mod;
}
if(i>=2&&j)
{
dp[i-2][j-1]+=dp[i][j]*j*(i-1);
dp[i-2][j-1]=dp[i-2][j-1]%mod;
}
if(i&&j>=2)
{
dp[i-1][j-2]+=dp[i][j]*c[j][2];
dp[i-1][j-2]=dp[i-1][j-2]%mod;
}
if(i==0&&j!=m)
{
otg+=dp[i][j];
otg=otg%mod;
}
}
}
cout<<otg<<endl;
}
int main()
{
speed();
read();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |