炮(cannon)
炮(cannon)
【题目描述】
众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技。炮吃子时必须隔一个棋子跳吃,即俗称“炮打隔子”。 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘上摆了起来……他想知道,在N×M的矩形方格中摆若干炮(可以不摆)使其互不吃到的情况下方案数有几种。
棋子都是相同的。
【输入说明】
一行,两个正整数N和M。
【输出说明】
一行,输出方案数mod 999983。
【样例输入】
1 3
【样例输出】
7
【数据范围】
对于40%的数据,N<=4,M<=4
对于70%的数据,N<=100,M<=8
对于100%的数据,N<=100,M<=100
【题目分析】
DP。f[i][j][k]表示前i行放1个炮的有j列,放2个炮的有k(m-j)列。(每一行或者一列都是最多只能放两个炮)
1.该行不放炮;
2.该行在没有炮的1列中放置1个炮的方案数为 f[i-1][j-1][k]*(m-i-j+1);
3.该行在有1个炮的1列中放置1个炮(那这列就变成2个炮)的方案数为 f[i-1][j+1][k-1]*(j+1);
4.该行在没有炮的2列中各放置1个炮的方案数为 f[i-1][j-2][k]*C(m-j-k-2);
5.该行在有1个炮和没有炮的2列中各放置1个炮的方案数为 f[i-1][j][k-1]*(m-j-k+1)*j;
6.该行在有1个炮的2列中各放置1个炮的方案数为 f[i-1][j+2][k-2]*C(j+2,2);
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int mo=;
int m,n;
int ans=;
long long f[][][];
int C(int t)
{
return ((t*(t-))>>)%mo;
}
int main()
{
freopen("cannon.in","r",stdin);
freopen("cannon.out","w",stdout);
scanf("%d%d",&n,&m);
f[][][]=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int k=;k<=m-j;k++)
{
f[i][j][k]=f[i-][j][k];
if (j) f[i][j][k]=(f[i][j][k]+f[i-][j-][k]*(m-j-k+)%mo)%mo;
if (k&&j<m) f[i][j][k]=(f[i][j][k]+f[i-][j+][k-]*(j+)%mo)%mo;
if (j>) f[i][j][k]=(f[i][j][k]+f[i-][j-][k]*C(m-j-k+)%mo)%mo;
if (j&&k) f[i][j][k]=(f[i][j][k]+f[i-][j][k-]*(m-j-k+)%mo*j%mo)%mo;
if (k>&&j<m-) f[i][j][k]=(f[i][j][k]+f[i-][j+][k-]*C(j+)%mo)%mo;
}
for (int i=;i<=m;i++)
for (int j=;j<=m-i;j++)
ans=(ans+f[n][i][j])%mo;
printf("%d",ans);
fclose(stdin);fclose(stdout);
return ;
}
炮(cannon)的更多相关文章
- 【贪心】小Y的炮[cannon]题解
模拟赛的题目,做的时候由于第二题表打太久了,只剩下40分钟,想都没想就写了一个爆搜20分... 这道题单调性很关键,下面会解释 P.S.解释在代码里 #include<cstdio> #i ...
- 模拟赛1102d1
炮(cannon)[题目描述]众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子". 炮跟炮显然不能在一起打起来,于是rly一天借来了 ...
- 11.2 morning
noip模拟题day1——棋盘上的问题 day1模拟题 By FancyCoder总览(Overview)注意事项:共3道题目,时间2.5小时.Pascal选手允许使用math库和ansistring ...
- 济南学习 Day 5 T1 am
炮(cannon)[题目描述]众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称“炮打隔子”. 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘上 ...
- ImageNet2017文件下载
ImageNet2017文件下载 文件说明 imagenet_object_localization.tar.gz包含训练集和验证集的图像数据和地面实况,以及测试集的图像数据. 图像注释以PASCAL ...
- ImageNet2017文件介绍及使用
ImageNet2017文件介绍及使用 文件说明 imagenet_object_localization.tar.gz包含训练集和验证集的图像数据和地面实况,以及测试集的图像数据. 图像注释以PAS ...
- hdu 4499 Cannon dfs
Cannon Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4499 D ...
- hdu 4499 Cannon(暴力)
题目链接:hdu 4499 Cannon 题目大意:给出一个n*m的棋盘,上面已经存在了k个棋子,给出棋子的位置,然后求能够在这种棋盘上放多少个炮,要求后放置上去的炮相互之间不能攻击. 解题思路:枚举 ...
- hdu4499 Cannon (DFS+回溯)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=4499 Cannon ...
随机推荐
- 详细介绍dll文件是什么
DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件一般被存放在C:WindowsSystem目录下.DLL是一个包含可由多个程序同时使用的代码和数据的库. 在Wind ...
- fread与fwrite的自我理解
size_t fread(void* buff,size_t size,size_t count,FILE* stream) 参数1:读取到该buff所指向的内存空间中 参数2:每次读取的字节数,单 ...
- start.s 解析(一)
可以参考 : http://blog.csdn.net/bluesummerg/article/details/5940452 (强大的反汇编) http://www.cnblogs.com/yanh ...
- webpack 无法安装
命令行输入: npm install webpack -g 解决办法:增加环境变量 D:\nine\trunk\node_modules\.bin\ bin目录下有webpack.cmd 如果还是 ...
- Jar mismatch! Fix your dependencies
在开发Android项目的时候,有时需要引用多个项目作为library.在引用项目的时候,有时会出现“Jar mismatch! Fix your dependencies”错误. 这是因为两个项目的 ...
- iOS的第一个习作
首发:个人博客,更新&纠错&回复 代码在这里,对git还是使用不熟练,好在github新建项目后体贴地提示是不是要执行这样两句—— 这两句我肯定是背不住的,所以记一下. git rem ...
- JVM复习笔记
1. JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...
- python 三元运算符
print (1==2) and 12 or 4 b=12 if 1==2 else 4print(b)
- 关于 ActiveMQ
今天玩了下 ActiveMQ,希望实现服务器的消息可以通知到各个客户终端. 安装: 1.安装 ActiveMQ 之前必须安装 Java 的 jdk , 可以从此下载: http://www.ora ...
- V4L2学习笔记【转】
本文转载自:http://www.cnblogs.com/silence-hust/p/4464291.html v4l2,一开始听到这个名词的时候,以为又是一个很难很难的模块,涉及到视频的处理,后来 ...