博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1801:[Ahoi2009]chess 中国象棋
阅读量:4669 次
发布时间:2019-06-09

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

Time Limit: 10 Sec  Memory Limit: 64 MB

Description

在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧.

Input

一行包含两个整数N,M,中间用空格分开.

Output

输出所有的方案数,由于值比较大,输出其mod 9999973

Sample Input

1 3

Sample Output

7

HINT

除了在3个格子中都放满炮的的情况外,其它的都可以.

100%的数据中N,M不超过100
50%的数据中,N,M至少有一个数不超过8
30%的数据中,N,M均不超过6

Source

用f[i][j][k]在前i行有j行放了一个炮,有k行放了两个炮。

所以这道题的转移有6种

1.不放

2.在未放过的一列放一个

3.在已经放一个的一列放一个

4.在未放过的一列放两个

5.在已经放过一个的两列各放一个

6.分别在未放过的和已经放一个的一列各放一个

#include
typedef long long ll;const int mod=9999973;int f[105][105][105];int main(){ int n,m,ans=0; scanf("%d%d",&n,&m); f[0][0][0]=1; for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k+j<=m;k++) { f[i][j][k]=f[i-1][j][k]; if(j) f[i][j][k]+=(ll)(m-j-k+1)*f[i-1][j-1][k]%mod,f[i][j][k]%=mod; if(k) f[i][j][k]+=((ll)(j+1)*f[i-1][j+1][k-1]+(ll)(m-j-k+1)*j%mod*f[i-1][j][k-1])%mod,f[i][j][k]%=mod; if(k>1) f[i][j][k]+=((ll)(j+2)*(j+1)/2%mod*f[i-1][j+2][k-2])%mod,f[i][j][k]%=mod; if(j>1) f[i][j][k]+=(ll)(m-j+2-k)*(m-j+1-k)/2%mod*f[i-1][j-2][k]%mod,f[i][j][k]%=mod; if(i==n) ans+=f[i][j][k],ans%=mod; } printf("%d",ans); return 0;}

转载于:https://www.cnblogs.com/bzmd/p/6249713.html

你可能感兴趣的文章
linux环境变量设置和修改
查看>>
[Android]Notification汇总
查看>>
[COURSE_PTHE] 4. 枚举
查看>>
div设置overflow-scroll滚动之后,jq获取其子元素的offset.top出现问题。
查看>>
ReactNative项目xcode打包运行报错整理
查看>>
Django之数据表增删改查
查看>>
自动生成滚动条
查看>>
JS事件
查看>>
SSL 3.0曝出Poodle漏洞的解决方案-----开发者篇(转自:http://blog.csdn.net/lyq8479/article/details/40709175)...
查看>>
Personal Leetcode solution(Python) 1~20
查看>>
延时器弹窗
查看>>
5.1什么是视图
查看>>
WWDC 2015大会到来了
查看>>
JSP 入门 HTML嵌套Java脚步 显示时间
查看>>
【自爆系列】如何从整体上削弱一支队伍的技术水平
查看>>
MySQL实习训练1
查看>>
HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】
查看>>
Hashtable几种常用的遍历方法
查看>>
hadoop 3.0.0 alpha3 安装、配置
查看>>
在Windows Server通过MMC导入客户证书的注意事项
查看>>