要求就是每行每列个数<=2
设
f[i][j][k]
表示到第i行,有j列有0个,k列没有的方案数。
然后当前行可以放一个或两个。
#include <bits/stdc++.h>
using namespace std;
#define N 110
#define mod 9999973
#define ll long long
int n,m;
int f[N][N][N],ans;
void upd(int &x,int y){x=(x+y)%mod;}
int main()
{
//freopen("tt.in","r",stdin);
scanf("%d%d",&n,&m);
f[0][m][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=0;k+j<=m;k++)
{
upd(f[i][j][k],f[i-1][j][k]);
if(j)upd(f[i][j-1][k+1],f[i-1][j][k]*j%mod);
if(k)upd(f[i][j][k-1],f[i-1][j][k]*k%mod);
if(j>=2)upd(f[i][j-2][k+2],(ll)f[i-1][j][k]*(j*(j-1)/2)%mod);
if(k>=2)upd(f[i][j][k-2],(ll)f[i-1][j][k]*(k*(k-1)/2)%mod);
if(j&&k)upd(f[i][j-1][k],(ll)f[i-1][j][k]*j*k%mod);
}
for(int i=0;i<=m;i++)
for(int j=0;i+j<=m;j++)
upd(ans,f[n][i][j]);
printf("%d\n",ans);
return 0;
}