洛谷 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\) ...
随机推荐
- Linux iptables 防火墙设置
1.查看防火墙iptables -L -niptablesb -L -n --line-number 显示规则行号看到 INPUT ACCEPT, FORWARD ACCEPT , OUTPUT A ...
- Codeforces 798D Mike and distribution (构造)
题目链接 http://codeforces.com/contest/798/problem/D 题解 前几天的模拟赛,居然出这种智商题..被打爆了QAQ 这个的话,考虑只有一个序列怎么做,把所有的排 ...
- php的mysql语法
php操作mysqli(示例代码) 更新时间:2013年10月28日 :: 作者: 我要评论 关注脚本之家微信公众号(jb51net) 每周都有大礼相送哦 php操作mysqli的示例代码.需要的朋友 ...
- 前端学习之一_html学习
html元素分类 内连元素:出现在行内的元素 <img>,<q>,<a> 块元素:前后自动插入换行的元素 <h1> ...
- sessionStorge和localStorage的使用-踩坑记_09
sessionStorge的使用 sessionStorage 属性允许你访问一个 session Storage 对象.它与 localStorage 相似,不同之处在于 localStorage ...
- C++入门经典-例4.4-循环嵌套之求n的阶乘
1:代码如下: // 4.4.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...
- 20175215 2018-2019-2 第七周java课程学习总结
第八章 常用实用类 8.1 String类 Java专门提供了用来处理字符序列的String类.String类在java.lang包中,由于java.lang包中的类被默认引入,因此程序可以直接使用S ...
- 套接字之recvmsg系统调用
recvmsg系统调用允许用户指定msghdr结构来接收数据,可以将数据接收到多个缓冲区中,并且可以接收控制信息:接收信息过程与其他接收系统调用核心一致,都是调用传输层的接收函数进行数据接收: SYS ...
- 一、基础篇--1.1Java基础-equals与==的区别
==: ==比较的是变量内存中存放的对象的内存地址,用来判断两个对象地址是否相同,比较的是否是同一个对象. 1.两边的操作数必须是同一类型,不然编译不通过. 2.如果是基本数据类型比较,值相等则为tr ...
- 使用Jmeter性能测试注意点
一.性能测试注意点 1. 用jmeter测试时使用BeanShell脚本获取随机参数值,会导致请求时间过长,TPS过低.应改为使用csv读取参数值,记录的TPS会更加准确. 注:进行性能测试时,应注意 ...