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. 完美修改iOS项目名

    注意:重命名项目时,记得先备份好一份 1.选中旧项目名,改为新项目名: 选择rename: 2.修改相关文件夹名称: 3.全局搜索旧项目名称,然后替换为新项目名称: 4.经过步骤3的替换,再次全局搜索 ...

  2. Apache 工作模式配置优化

    Apahce 工作模式配置 1.查看当前MPM工作模式 /usr/local/apache2/bin/apachectl -V Server version: Apache/2.4.27 (Unix) ...

  3. 20145201《Java程序设计》第十周学习总结

    教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴. 在发送和接收 ...

  4. NSwag在asp.net web api中的使用,基于Global.asax

    https://github.com/NSwag/NSwag/wiki/OwinGlobalAsax This page explains how to use the NSwag OWIN midd ...

  5. linux tzselect 设置时区

    date -R 检查时间 tzselect 按照提示逐步设置 //这里演示的是设置东八区 TZ='Asia/Shanghai'; export TZ 添加到/etc/profile source pr ...

  6. EF Code-First 学习之旅 数据库初始化

    1.CreateDatabaseIfNotExists: 2.DropCreateDatabaseIfModelChanges: 3.DropCreateDatabaseAlways: 4.Custo ...

  7. CommStringLib

    #include "syswatcher/CommStringLib.h" //#include "String16.h" #undef LOG_TAG #de ...

  8. centos 使用rz sz指令

    在linux下安装rz很方便,使用 yum install lrzsz 就可以安装,正常使用rz和sz命令. 下面对sz和rz命令的一点介绍: 一般来说,linux服务器大多是通过ssh客户端来进行远 ...

  9. dataframe 列名重新排序

    在用list包含多个dict的模式生成dataframe时,由于dict的无序性,而uci很多数据的特征名直接是1,2,3...,生成的dataframe和原生的不一样, 为了方便观看和使用,我们将其 ...

  10. lucene学习-2 - 一个示例

    接下来我会写一个lucene的实例.实际上在搜索引擎上随便搜索下都能找到这样的东西.不过还是写一下吧,这也是我学习的经历. package com.zhyea.doggie; import java. ...