比较明显的计数dp。不知道为什么被打了状压的tag...

不难发现无论炮放在哪里其实是等价的,需要知道的只有这一列放了一个炮还是两个炮还是还没放,那么可以设\(f[i,j,k]\)表示第\(i\)行,一共有\(j\)列放了两个炮,\(k\)列放了一个炮。

然后转移考虑一下选数的组合意义即可。

#include <bits/stdc++.h>
using namespace std; typedef long long ll; const int N = 100010;
const int mod = 9999973; int n, m, fac[N], inv[N];
int f[110][110][110];
// f[i][j][k] 表示前i行,然后有j列放了两个,k列放了一个 int power(int a, int b) {
int ans = 1;
while(b) {
if(b & 1) ans = 1ll * ans * a % mod;
a = 1ll * a * a % mod; b >>= 1;
}
return ans;
} int C(int n, int m) {
if(n > m) return 0;
return 1ll * fac[m] * inv[m - n] % mod * inv[n] % mod;
} int main() {
scanf("%d%d", &n, &m);
fac[0] = inv[0] = 1;
for(int i = 1; i < N; ++i) fac[i] = 1ll * fac[i - 1] * i % mod;
for(int i = 1; i < N; ++i) inv[i] = power(fac[i], mod - 2);
f[0][0][0] = 1;
for(int i = 0; i < n; ++i)
for(int j = 0; j <= m; ++j)
for(int k = 0; j + k <= m; ++k)
if(f[i][j][k]) {
// 不放
(f[i + 1][j][k] += f[i][j][k]) %= mod;
// 放一个
if(k + 1 <= m) (f[i + 1][j][k + 1] += 1ll * f[i][j][k] * C(1, m - j - k) % mod) %= mod;
if(j + 1 <= m && k) (f[i + 1][j + 1][k - 1] += 1ll * f[i][j][k] * C(1, k) % mod) %= mod;
// 放两个
if(j + 2 <= m && k >= 2) (f[i + 1][j + 2][k - 2] += 1ll * f[i][j][k] * C(2, k) % mod) %= mod;
if(k + 2 <= m) (f[i + 1][j][k + 2] += 1ll * f[i][j][k] * C(2, m - j - k) % mod) %= mod;
if(j + 1 <= m) (f[i + 1][j + 1][k] += 1ll * f[i][j][k] * C(1, m - j - k) % mod * C(1, k) % mod) %= mod;
}
int ans = 0;
for(int i = 0; i <= m; ++i) {
for(int j = 0; i + j <= m; ++j) {
(ans += f[n][i][j]) %= mod;
// printf("%d %d %d\n", i, j, f[n][i][j]);
}
}
// puts("");
printf("%d\n", ans);
}

最新文章

  1. MySQL DCL 整理
  2. 免费SSL证书Let’s Encrypt
  3. Json.net对于导航属性的处理(解决对象循环引用)
  4. python的类和对象——番外篇(类的静态字段)
  5. 【Delphi】从内存(MemoryStream)使用WMP(WindowsMediaPlayer)控件播放视频音频(Play Video with WMP from MemoryStream)
  6. HDU 1540 / POJ 2892 Tunnel Warfare (单点更新,区间合并,求包含某点的最大连续个数)
  7. Servlet3.0学习总结(三)——基于Servlet3.0的文件上传
  8. 395. Coins in a Line II
  9. Android 百度地图 SDK v3.0.0 (一)
  10. 无限的路_hdu_2073(AC).java
  11. php学习的第8天
  12. JUC学习笔记--JUC中并发工具类
  13. ORACLE 字段AES算法加密、解密
  14. linux网络设置和虚拟机克隆转移之后网卡找不到
  15. 力扣(LeetCode)728. 自除数
  16. 【翻译自mos文章】Windows平台下的 Oraagent Memory Leak
  17. C#中类的序列化和反序列化
  18. php-fpm.conf 重要参数 max_children 和 request_terminate_timeout
  19. iOS开发-通过正则表达式进行各种判断银行卡,车牌号,邮箱地址,QQ,身份证,全字母,仅输入字母或数字同时包含大小写字母和数字,仅能输入中文等
  20. JXLS导出Excel(模板导出)

热门文章

  1. kafka生产部署
  2. imagettftext(): Could not read font
  3. 机器学习中什么是端到端的学习(end-to-end learning)?
  4. shared_ptr 用法
  5. 函数式接口java.util.function
  6. java之spring之scope和autowiring
  7. Java调用Http/Https接口(6)--RestTemplate调用Http/Https接口
  8. shell截取字符串操作
  9. 供应链管理如何提高效率?APS系统成优化引擎
  10. resfframework中修改序列化类的返回值