bzoj 4806 炮
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 炮的更多相关文章
- Bzoj 4806 炮 (dp)
题目描述 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子". 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘 ...
- bzoj 4806: 炮【dp】
同1801 注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include< ...
- BZOJ 4806 - 4809 象棋四题
4806: 炮 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 103 Solved: 72[Submit][Status][Discuss] Des ...
- bzoj 4591 超能粒子炮·改 - Lucas
Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...
- Bzoj 4591: [Shoi2015]超能粒子炮·改 数论,Lucas定理,排列组合
4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 178 Solved: 70[Submit][Stat ...
- bzoj 4591: [Shoi2015]超能粒子炮·改 [lucas定理]
4591: [Shoi2015]超能粒子炮·改 题意:多组询问,求 \[ S(n, k) = \sum_{i=0}^n \binom{n}{i} \mod 2333,\ k \le n \le 10^ ...
- BZOJ 4591 【SHOI2015】 超能粒子炮·改
题目链接:超能粒子炮·改 这道题的大体思路就是用\(lucas\)定理,然后合并同类项,就可以得到一个可以递归算的式子了. 我们用\(S(n,k)\)表示答案,\(p\)表示模数(\(2333\)是一 ...
- bzoj千题计划279:bzoj4591: [Shoi2015]超能粒子炮·改
http://www.lydsy.com/JudgeOnline/problem.php?id=4591 最后的式子合并同类项 #include<cstdio> #include<i ...
- [BZOJ 4591] 超能粒子炮-改
Link: 传送门 Solution: 记录一下推$\sum_{i=0}^k C_n^i$的过程: 其实就是将相同的$i/p$合起来算,这样每个里面都是一个可以预处理的子问题 接下来递归下去算即可 T ...
随机推荐
- Nested DollsHDU1677
/*题意:有n个矩形,用长和宽表示,如果一个的长和宽都比另一个小,那么这个嵌放在另一个中 所以先对w从大到小排序,w一样的按h从小到大排序,那么就从后面的箱子往前找,只要前面找到一个人h比自己大的就放 ...
- 【Java】仿真qq尝试:聊天界面 && 响应用户输入
需求分析: 逐步完善一个“qq仿真”程序. 参考: 1.文本框与文本区:http://www.weixueyuan.net/view/6062.html 2.java布局:http://www.cnb ...
- jQuery鼠标滑动切换焦点图
在线演示 本地下载
- 转一篇Git代码回滚技巧
转 https://github.com/geeeeeeeeek/git-recipes/wiki/5.2-代码回滚:Reset.Checkout.Revert的选择
- HDU 1263 二维map
题意:给出一份水果的交易表,根据地区统计出水果的交易情况. 思路:二维map使用. #include<cstdio> #include<string> #include ...
- 使用MyCat分表分库原理分析
Mycat可以实现 读写分离 分表分库 主从复制是MySQL自带的哈~ 关于分片取模算法: 根据id进行取模 根据数据库集群的数量(或者说是表数量,mycat里面一个表对应一个库) 使用MyCat ...
- Github删除账号方法
1.登录后点击头像,选择Settings 2.选择Account,然后再选择Delete your account 3.第一个输入框输入邮箱或者用户名,第二个输入框输入delete my accoun ...
- Python中有趣的数据结构
链表 链表的基本操作 >>> a = [66.25,333,333,1,1234.5] >>> print a.count(333),a.count(66.25), ...
- LeetCode第[7]题(Java):Reverse Integer 标签:数学
题目:Reverse Integer 难度:Easy 题目内容: Given a 32-bit signed integer, reverse digits of an integer. Note:A ...
- numpy 矩阵归一化
new_value = (value - min)/(max-min) def normalization(datingDatamat): max_arr = datingDatamat.max(ax ...