# BZOJ4806_炮

解:


本质上就是说,每行或每列上不能放大于等于三个炮

考虑这样一个dp:

令f[i][j][k]表示:前i行,有j列没放,有k列放一个,((m - j - k)列放了两个)

则有如下转移:

1、这一行不放,f[i][j][k]=f[i1][j][k]

2、这一行放一个:

2.1、这一个放在一个没放的列上:f[i][j][k]+=f[i1][j+1][k1]Cj+11

2.2、这一个放在一个有一个的列上:f[i][j][k]+=f[i1][j][k+1]Ck+11

3、这一行放两个:

3.1、两个都放在没放的列上: f[i][j][k]+=f[i1][j+2][k2]Cj+22

3.2、两个一个放在没放的列上,一个放在一个的列上: f[i][j][k]+=f[i1][j+1][k]Cj+11Ck1

3.3、两个都放在一个的列上: f[i][j][k]+=f[i1][j][k+2]Ck+22


按照如上方程逐个转移即可

特别的,初始化:

先算出第一行的答案,

f[1][m][0]=1

f[1][m1][1]=Cm1=m

f[1][m2][2]=Cm2

然后i从第二行开始枚举

代码:


#include <bits/stdc++.h> using namespace std; typedef long long ll; const int md = 999983; ll n, m, ans; ll f[110][110][110]; ll C(ll x, ll y) { if (y == 1) return x; return ((x * (x - 1)) / 2) % md; }//因为y只有1和2两种取值,所以就简写了 //1079364439 int main() { scanf("%lld%lld", &n, &m); f[1][m][0] = 1; f[1][m - 1][1] = m; f[1][m - 2][2] = C(m, 2); for (int i = 1; i <= n; i++) { for (int j = 0; j <= m; j++) { for (int k = 0; k + j <= m; k++) { f[i][j][k] = (f[i][j][k] + f[i - 1][j][k]) % md; if (k >= 1 && j + 1 <= m) f[i][j][k] = (f[i][j][k] + f[i - 1][j + 1][k - 1] * C(j + 1, 1)) % md; if (k + 1 <= m) f[i][j][k] = (f[i][j][k] + f[i - 1][j][k + 1] * C(k + 1, 1)) % md; if (k >= 2 && j + 2 <= m) f[i][j][k] = (f[i][j][k] + f[i - 1][j + 2][k - 2] * C(j + 2, 2)) % md; if (j + 1 <= m) f[i][j][k] = (f[i][j][k] + f[i - 1][j + 1][k] * C(j + 1, 1) * C(k, 1)) % md; if (k + 2 <= m) f[i][j][k] = (f[i][j][k] + f[i - 1][j][k + 2] * C(k + 2, 2)) % md; } } } for (int j = 0; j <= m; j++) for (int k = 0; k <= m; k++) ans = (ans + f[n][j][k]) % md; cout << ans << endl; return 0; }

一定看清模数到底是多少,不要像我一样查半天最后发现是模数打错了


__EOF__

本文作者熹圜
本文链接https://www.cnblogs.com/Xiwon/p/13527131.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   熹圜  阅读(110)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示