从昨天调到今天
dp[i][a][b]:到第i列,0个的有a行,1个的有b行时,方案的总数。
#include<bits/stdc++.h>
using namespace std;
const int MOD=9999973;
long long dp[105][105][105],t[105];
long long ftr(int p){//ftr:阶乘
if(t[p]) return t[p];
t[p]=p*ftr(p-1)%MOD;
return t[p];
}
long long C(int m,int n){
return (ftr(n)/((ftr(m)*ftr(n-m))%MOD))%MOD;
}
int main(){
t[0]=t[1]=1;
int n,m;
cin>>n>>m;
dp[0][m][0]=1;
for(int i=1;i<=n;i++){
for(int a=0;a<=m;a++)
for(int b=0;b<=m-a;b++){
//if none put
dp[i][a][b]=(dp[i][a][b]+dp[i-1][a][b])%MOD;
//if only one put
if(b>=1 && a<=m-1) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a+1][b-1]*(a+1))%MOD;
if(b<=m-1) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a][b+1]*(b+1))%MOD;
//if two put
if(b>=2 && a<=m-2) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a+2][b-2]*C(2,a+2))%MOD;
if(a<=m-1) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a+1][b]*(a+1)*b)%MOD;
if(b<=m-2) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a][b+2]*C(2,b+2))%MOD;
}
}
long long ans=0;
for(int a=0;a<=m;a++)
for(int b=0;b<=m;b++)
ans=(ans+dp[n][a][b])%MOD;
// for(int i=0;i<=n;i++){
// for(int a=0;a<=m;a++)
// for(int b=0;b<=m;b++)
// printf("dp[%d][%d][%d]=%d\n",i,a,b,dp[i][a][b]);
// cout<<endl;
// }
cout<<ans;
return 0;
}