如下,我设的状态 fi,j,k 代表前 i 行已经考虑好了,此时有 j 个放了 0 个炮的列,有 k 个放了 1 个炮的列的方案数。
本应该是这样枚举,因为不可能出现 j+k>m 的情况,但是我这样改了以后也那样把答案统计了进去,为什么会AC?
for(int j=0;j<=m;j++)
for(int k=0;k<=m-j;k++)
for(int i=0;i<=m;i++)
for(int j=0;j<=m-i;j++)
#include<bits/stdc++.h>
using namespace std;
const int mod=9999973;
int n,m;
int ans;
int f[105][105][105];
int c[105][105];
void init()
{
for(int i=2;i<=105;i++)
c[i][2]=i*(i-1)/2%mod;
}
int main()
{
scanf("%d%d",&n,&m);
init();
f[0][m][0]=1;
for(int i=0;i<=n-1;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<=m;k++)
{
f[i+1][j][k]=(f[i+1][j][k]+f[i][j][k])%mod;
if(j>=1) f[i+1][j-1][k+1]=(f[i+1][j-1][k+1]+(1ll*f[i][j][k]*j%mod))%mod;
if(k>=1) f[i+1][j][k-1]=(f[i+1][j][k-1]+(1ll*f[i][j][k]*k%mod))%mod;
if(j>=1) f[i+1][j-1][k]=(f[i+1][j-1][k]+(1ll*f[i][j][k]*j*k%mod))%mod;
if(j>=2) f[i+1][j-2][k+2]=(f[i+1][j-2][k+2]+(1ll*f[i][j][k]*c[j][2]%mod))%mod;
if(k>=2) f[i+1][j][k-2]=(f[i+1][j][k-2]+(1ll*f[i][j][k]*c[k][2]%mod))%mod;
}
for(int i=0;i<=m;i++)
for(int j=0;j<=m;j++)
ans=(ans+f[n][i][j])%mod;
printf("%d",ans);
return 0;
}