洛谷 P2051 中国象棋 题解
状态可能不太好想,设f[i][j][k]表示前i行其中有j行是放一个炮,有k行是放两个炮的合法方案数;
那么:
f[i+1][j][k]+=f[i][j][k] 在这一行不放任何棋子;
f[i+1][j+1][k]+=f[i][j][k]*(m-k-j); 在剩余的m-k-j个空行中随机选择一个放下一个炮;
f[i+1][j-1][k+1]+=f[i][j][k]*(j); 在有一个棋子的j行中随机选择一个放下一个炮,则拥有两个炮的行数便加1;
f[i+1][j-2][k]+=f[i][j][k]*C(m-k-j,2); 在剩余的m-k-j个空行中随机选择两个不相同的行(利用组合数);
f[i+1][j][k+1]+=f[i][j][k]*(m-k-j)*j; 选择一个放了一个炮的行和一个没放炮的行各放一个炮;
f[i+1][j-2][k+2]+=f[i][j][k]*C(j,2); 选择两个放了一个炮的行各放一个炮;
注意数组的下标不可以是负数!!!!!
ans就是sigma(f[n][j][k])(j+k<=m)
注意边界处理 ,a[0][0][0]=1;
#include <bits/stdc++.h>
#define int long long
#define p 9999973
using namespace std;
int N,M;
int f[][][];
int C(int n)
{
return n*(n-)/;
}
signed main()
{
cin>>N>>M;
f[][][]=;
for(int i=;i<N;i++){
for(int j=;j<=M;j++){
for(int k=;k+j<=M;k++){
f[i+][j][k]=(f[i+][j][k]+f[i][j][k])%p;
if(M-k-j>=) f[i+][j+][k]=(f[i+][j+][k]+f[i][j][k]*(M-k-j))%p;
if(j>=) f[i+][j-][k+]=(f[i+][j-][k+]+f[i][j][k]*j)%p;
if(M-k-j>=) f[i+][j+][k]=(f[i+][j+][k]+f[i][j][k]*C(M-j-k))%p;
if(M-j-k>=&&j>=)f[i+][j][k+]=(f[i+][j][k+]+f[i][j][k]*(M-j-k)*j)%p;
if(j>=) f[i+][j-][k+]=(f[i+][j-][k+]+f[i][j][k]*C(j))%p;
}
}
}
long long ans=;
for(int i=;i<=M;i++){
for(int j=;i+j<=M;j++){
ans=(ans+f[N][i][j])%p;
}
}
cout<<ans;
}
洛谷 P2051 中国象棋 题解的更多相关文章
- 洛谷P2051 中国象棋
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- 洛谷 - P2051 - 中国象棋 - 简单dp
https://www.luogu.org/problemnew/show/P2051 一点都不简单的简单dp. 还是从旧行转移到新行,而不是考虑新行从哪些旧行转移吧. #include<bit ...
- 洛谷P2051 中国象棋【dp】
题目:https://www.luogu.org/problemnew/show/P2051 题意:n*m的格子里放炮,使他们不能互相攻击. 如果两个炮在同一行同一列并且中间还有一个棋子的话就可以攻击 ...
- 洛谷P2051 中国象棋(dp)
题目链接:传送门 题目大意: 在N行M列的棋盘中放象棋中的“炮”,问要使得“炮”两两互不伤害,有多少种放法. 1 ≤ n,m ≤ 100,答案对9999973取模. 思路: 按行更新答案.每行炮可以放 ...
- 洛谷 [P2051] 中国象棋
DP orz__stdcall 首先要想出来,每行最多只能放两个棋子,这是显然的 于是决策就是一行一行地处理 30分的做法就是裸的枚举,暴搜,枚举这一行放哪里,放几个 然后想到了压位dp,按3进制表示 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- P2051 中国象棋
P2051 中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中 ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
随机推荐
- PHP教程-反序列化的方法
序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性.兄弟连PHP培训() 1. ...
- sh_01_列表基本使用
sh_01_列表基本使用 name_list = ["zhangsan", "lisi", "wangwu"] # 1. 取值和取索引 # ...
- codefroces Round #201.a--Difference Row
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description You wa ...
- [JZOJ5399]:Confess(随机化)
题目描述 小$w$隐藏的心绪已经难以再隐藏下去了. 小$w$有$n+1$(保证$n$为偶数)个心绪,每个都包含了$[1,2n]$的一个大小为$n$的子集. 现在他要找到隐藏的任意两个心绪,使得他们的交 ...
- docker-compose常用命令(持续更新...)
build 构建或重建服务 help 命令帮助 kill 杀掉容器 logs 显示容器的输出内容 port 打印绑定的开放端口 ps 显示容器 pull 拉取服务镜像 restart 重启服务 rm ...
- JVM----堆上为对象动态分配内存
jvm中内存划分: 如上图,一共分为五块,其中: 线程共享区域为: 1.java堆 2.方法区 线程私有区域为: 3.JVM栈 4.本地方法栈 5.程序计数器 java技术体 ...
- Removing jQuery from GitHub.com frontend
Removing jQuery from GitHub.com frontend Web standards in the later years Over the years, GitHub gre ...
- jenkins 内置变量
Jenkins 有一些内置的变量可以使用.主要是: 邮件的配置变量,可以在发送邮件的时候使用. 环境变量 1. 邮件的配置变量 ${GIT_BRANCH} - build 的 Git 分支 ${FIL ...
- Learn The Architecture Memory Management 译文
1.概述 本文档介绍了ARMv8-A架构内存管理的关键——内存地址转换,包括虚拟地址(VA)到物理地址(PA)的转换.页表(或称地址转换表)格式以及TLBs(Translation Lookaside ...
- 转 Cookie、Session
https://www.cnblogs.com/liwenzhou/p/8343243.html Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况 ...