博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ] 4806 炮
阅读量:6241 次
发布时间:2019-06-22

本文共 1386 字,大约阅读时间需要 4 分钟。

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 793  Solved: 392[Submit][Status][Discuss]Description众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技。炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子"。 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘上摆了起来……他想知道,在N×M的矩形方格中摆若干炮(可以不摆)使其互不吃到的情况下方案数有几种。棋子都是相同的。Input一行,两个正整数N和M。N<=100,M<=100Output一行,输出方案数mod 999983。Sample Input1 3Sample Output7HINTSourceBy FancyCoder[Submit][Status][Discuss]

大分类讨论,细心。

#include
#include
#define rsh now%=MOD#define int long longusing namespace std;const int MAXN=105;const int MOD=999983;int f[2][MAXN][MAXN];int n,m;int calc(int x){ return (x*(x-1)/2)%MOD;}signed main(){ cin>>n>>m; f[0][0][0]=1; for(int i=1;i<=n;i++){ for(int j=0;j<=m;j++){
//1 for(int k=0;k+j<=m;k++){
//2 int &now=f[i&1][j][k]; now=f[(i-1)&1][j][k]; if(k>=1) now+=f[(i-1)&1][j+1][k-1]*(j+1); if(k>=2) now+=f[(i-1)&1][j+2][k-2]*calc(j+2); if(j>=1) now+=f[(i-1)&1][j-1][k]*(m-j-k+1); if(j>=2) now+=f[(i-1)&1][j-2][k]*calc(m-j-k+2); if(k>=1) now+=f[(i-1)&1][j][k-1]*(m-j-k+1)*j; rsh; } } } int ans=0; for(int i=0;i<=m;i++){ for(int j=0;i+j<=m;j++){ ans+=f[n&1][i][j]; }ans%=MOD; } cout<
<

转载于:https://www.cnblogs.com/ghostcai/p/9247391.html

你可能感兴趣的文章
DNS服务
查看>>
ActiveMQ(21):Consumer高级特性之管理持久化订阅
查看>>
ActiveMQ(15):Message Dispatch的消息游标与异步发送
查看>>
Kubernetes+Etcd-v1.5.2 分布式集群部署
查看>>
表连接
查看>>
Delphi XE2 之 FireMonkey 入门(10) - 常用结构 TPoint、TPointF、TSmallPoint、TSize、TRect、TRectF 及相关方法...
查看>>
我的友情链接
查看>>
“对人不对事”和“对事不对人”
查看>>
CSS实现pre标签中内容换行方法
查看>>
领导牛B轰轰的 https 介绍应用
查看>>
Centos7下的Openssl和CA
查看>>
windows 2003防止网卡被禁用的设置
查看>>
lvs健康检测脚本
查看>>
马哥运维架构 第五周作业
查看>>
如何使用netstat命令验证DDOS***
查看>>
【zabbix学习笔记之三】部署zabbix-agent端
查看>>
找到数组中第i大、第i小的值
查看>>
我的友情链接
查看>>
ceph源码片段——c++引用
查看>>
list 之 增 删 改 查 排序 合并
查看>>