Written with StackEdit.

Description

众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技。炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子"。

炮跟炮显然不能在一起打起来,于是\(rly\)一天借来了许多许多的炮在棋盘上摆了起来……他想知道,在\(N×M\)的矩形

方格中摆若干炮(可以不摆)使其互不吃到的情况下方案数有几种。

棋子都是相同的。

Input

一行,两个正整数\(N\)和\(M\)。

\(N<=100,M<=100.\)

Output

一行,输出方案数\(mod\) \(999983\)。

Sample Input

1 3

Sample Output

7

Solution

  • 易知一行或一列最多只能放两个炮.
  • 注意到炮和皇后不一样,交换两行或两列是不影响的.
  • 所以我们不用记录具体的哪些列上有炮,只需要记录有\(1\)个炮的有几列,有\(2\)个炮的有几列就可以了.
  • 设\(f[i][j][k]\)表示放好前\(i\)行,其中\(j\)列有\(1\)个炮,\(k\)列有\(2\)个炮的方案数.
  • 转移的时候,讨论一下放\(0/1/2\)个炮,炮放在有\(0/1\)个炮的位置,刷表转移即可.
#include<bits/stdc++.h>
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
int n,m;
const int P=999983;
inline int add(int a,int b)
{
return (a + b) % P;
}
inline int mul(int a,int b)
{
return 1LL * a * b % P;
}
const int MAXN=110;
int f[MAXN][MAXN][MAXN];
inline void upd(int &x,int y)
{
x=add(x,y);
}
int main()
{
n=read(),m=read();
f[0][0][0]=1;
for(int i=0; i<=n-1; ++i)
for(int j=0; j<=m; ++j)//j列放了1个
for(int k=0; j+k<=m; ++k)//k列放了2个
{
if(!f[i][j][k])
continue;
int p=m-j-k;//没有炮的列数
//一行最多放2个炮
upd(f[i+1][j][k],f[i][j][k]);//不放
if(p>=1)
upd(f[i+1][j+1][k],mul(p,f[i][j][k]));//0 -> 1
if(j>=1)
upd(f[i+1][j-1][k+1],mul(j,f[i][j][k]));//1 -> 2
if(p>=1 && j>=1)
upd(f[i+1][j][k+1],mul(p*j,f[i][j][k]));//0 1 -> 1 2
if(p>=2)
upd(f[i+1][j+2][k],mul(p*(p-1)/2,f[i][j][k]));//0 0 -> 1 1
if(j>=2)
upd(f[i+1][j-2][k+2],mul(j*(j-1)/2,f[i][j][k]));//1 1 -> 2 2
}
int ans=0;
for(int j=0; j<=m; ++j)
for(int k=0; j+k<=m; ++k)
upd(ans,f[n][j][k]);
printf("%d\n",ans);
return 0;
}

bzoj 4806 炮的更多相关文章

  1. Bzoj 4806 炮 (dp)

    题目描述 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子".  炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘 ...

  2. bzoj 4806: 炮【dp】

    同1801 注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include< ...

  3. BZOJ 4806 - 4809 象棋四题

    4806: 炮 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 103  Solved: 72[Submit][Status][Discuss] Des ...

  4. bzoj 4591 超能粒子炮·改 - Lucas

    Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...

  5. Bzoj 4591: [Shoi2015]超能粒子炮·改 数论,Lucas定理,排列组合

    4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 178  Solved: 70[Submit][Stat ...

  6. bzoj 4591: [Shoi2015]超能粒子炮·改 [lucas定理]

    4591: [Shoi2015]超能粒子炮·改 题意:多组询问,求 \[ S(n, k) = \sum_{i=0}^n \binom{n}{i} \mod 2333,\ k \le n \le 10^ ...

  7. BZOJ 4591 【SHOI2015】 超能粒子炮·改

    题目链接:超能粒子炮·改 这道题的大体思路就是用\(lucas\)定理,然后合并同类项,就可以得到一个可以递归算的式子了. 我们用\(S(n,k)\)表示答案,\(p\)表示模数(\(2333\)是一 ...

  8. bzoj千题计划279:bzoj4591: [Shoi2015]超能粒子炮·改

    http://www.lydsy.com/JudgeOnline/problem.php?id=4591 最后的式子合并同类项 #include<cstdio> #include<i ...

  9. [BZOJ 4591] 超能粒子炮-改

    Link: 传送门 Solution: 记录一下推$\sum_{i=0}^k C_n^i$的过程: 其实就是将相同的$i/p$合起来算,这样每个里面都是一个可以预处理的子问题 接下来递归下去算即可 T ...

随机推荐

  1. 20145201《Java程序设计》第7周学习总结

    20145201 <Java程序设计>第七周学习总结 教材学习内容总结 本周学习了课本第十二.十三章内容,即Lambda.时间与日期 第十二章 Lambda 12.1 认识Lambda语法 ...

  2. 14.python模块之subprocess

    我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell.那么我们如何通过Python来完成这些命令行指令的执行呢?另外,我们应该知道的是命令行指令的执行通常有两 ...

  3. MD5key.java

    代码如下: package com.lekou.utils; public class MD5key { ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; , , , , , , , , ...

  4. TeamViewer---Linux远程控制利器

    TeamViewer中国官网 TeamViewer用户手册 参考链接一 参考链接二 参考链接三:每天一个linux命令(41):ps命令 简介 TeamViewer是一个远程控制软件,兼容于Micro ...

  5. Vue-深入-1

    1.关于vue get setVue 不能检测到对象属性的添加或删除 把一个普通 Javascript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object. ...

  6. Java多线程 - Callable和Future

    已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...

  7. Scala- Double类型工具类

    格式化分数,按照指定小数位四舍五入工具类 package com.rz.util object NumberUtils { /** * 格式化小数 * @param num Double对象 * @p ...

  8. 阿里云 centOS7.4新装nginx 不能访问

    反复装了几遍ngxin,什么防火墙,nginx.conf改了好几次都不能访问外网的ip, 原因是阿里云这货新的服务器根本就没开通443,80端口,真是坑人啊 点击配置规则,增加端口就行了 添加安全规则 ...

  9. JavaScript面向对象之Prototypes和继承

    本文翻译自微软的牛人Scott Allen Prototypes and Inheritance in JavaScript ,本文对到底什么是Prototype和为什么通过Prototype能实现继 ...

  10. mysql数据库优化课程---6、mysql结构化查询语言有哪些

    mysql数据库优化课程---6.mysql结构化查询语言有哪些 一.总结 一句话总结:主要分为四类 1.DCL 数据控制语言1)grant2)commit3)rollback 2.DDL 数据定义语 ...