为什么这样写也是能AC的?
查看原帖
为什么这样写也是能AC的?
773503
Falling_Sakura楼主2023/8/20 14:48

如下,我设的状态 fi,j,kf_{i,j,k} 代表前 ii 行已经考虑好了,此时有 jj 个放了 00 个炮的列,有 kk 个放了 11 个炮的列的方案数。

本应该是这样枚举,因为不可能出现 j+k>mj+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;
}
2023/8/20 14:48
加载中...