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. Java并发之Semaphore的使用

    Java并发之Semaphore的使用 一.简介 今天突然发现,看着自己喜欢的球队发挥如此的棒,然后写着博客,这种感觉很爽.现在是半场时间,就趁着这个时间的空隙,说说Java并发包中另外一个重量级的类 ...

  2. Linux系统服务管理 系统服务

    服务的分类 Linux 中的服务按照安装方法不同可以分为 RPM 包默认安装的服务和源码包安装的服务两大类.其中,RPM 包默认安装的服务又因为启动与自启动管理方法不同分为独立的服务和基于 xinet ...

  3. linux比较两个文件的不同(6/21)

    cmp 命令:比较任意两个类型的文件,且吧结果输出到标准输出,默认文件相同不输出,不同的文件输出差异 必要参数 -c 显示不同的信息-l 列出所有的不同信息-s 错误信息不提示 选择参数 -i< ...

  4. Tomcat 优化相关知识

    ---------(Tomcat Listener)----------- Tomcat 性能的因素是内存泄露.Server标签中可以配置多个Listener,其中 JreMemoryLeakPrev ...

  5. Cocos2d-x项目移植到WP8系列之九:使用自定义shader

    本文原链接:http://www.cnblogs.com/zouzf/p/3995132.html 有时候想得到一些例如灰度图等特殊的渲染效果,就得用到自定义shader,关于shader的一些背景知 ...

  6. toLatin1 toLocal8Bit

    toLatin1.toLocal8Bit都是QString转QByteArray的方法,Latin1代表ASCII,Local8Bit代表unicode

  7. 关于jquery的each遍历,return只终止当前循环,不好使的解决办法

    很奇怪,一般来说return会终止js,但是今天万万没想到的是,jquery 的each循环中,return不好使,做一记录, var result = true; $('input[type=&qu ...

  8. UNIDAC的安装

    UNIDAC的安装1.在source目录中找到对应Delphi版本目录的make.bat文件,修改其中的 set IdeDir="D:\Application\DelphiXE2指到你的de ...

  9. spark 参数调优

    调整partition数量,每次reduece和distict的时候都应该调整,数量太大和太小都不好,通常来讲保证一个partition的大小在1-2G左右为宜 调整excutors 调整core 调 ...

  10. LeetCode 之 TwoSum

    题目: Given an array of integers, find two numbers such that they add up to a specific target number. ...