济南学习 Day 5 T1 am
2024-09-07 23:48:19
炮(cannon)
【题目描述】
众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技。炮吃子时必须
隔一个棋子跳吃,即俗称“炮打隔子”。 炮跟炮显然不能在一起打起来,于是rly
一天借来了许多许多的炮在棋盘上摆了起来……他想知道,在N×M的矩形方格
中摆若干炮(可以不摆)使其互不吃到的情况下方案数有几种。
棋子都是相同的。
【输入说明】
一行,两个正整数N和M。
【输出说明】
一行,输出方案数mod 999983。
【样例输入】
1 3
【样例输出】
7
【数据范围】
对于40%的数据,N<=4,M<=4
对于70%的数据,N<=100,M<=8
对于100%的数据,N<=100,M<=100
/*
动态规划,状态的表示很巧妙
f[i][j][k]表示放了前i行,有j列放了1个,有k列放了2个,那么就有m-i-j列没放的方案数。然后完成转移。
*/
#include<cstdio>
#include<iostream>
#define mod 999983LL
#define N 110
using namespace std;
long long f[N][N][N],n,m;
int main()
{
cin>>n>>m;
f[][][]=;
for(long long i=;i<=n;i++)
for(long long j=;j<=m;j++)
for(long long k=;j+k<=m;k++)
{
f[i][j][k]=f[i-][j][k];f[i][j][k]%=mod;//不放
if(j>=)f[i][j][k]+=f[i-][j-][k]*(m-j-k+);f[i][j][k]%=mod;//空处放1个
if(k>=)f[i][j][k]+=f[i-][j+][k-]*(j+);f[i][j][k]%=mod;//1个处放1个
if(j>=)f[i][j][k]+=f[i-][j-][k]*(m-j-k+)*(m-j-k+)/;f[i][j][k]%=mod;//空处放2个
if(k>=)f[i][j][k]+=f[i-][j+][k-]*(j+)*(j+)/;f[i][j][k]%=mod;//1处放2个
if(k>=)f[i][j][k]+=f[i-][j][k-]*j*(m-j-k+);f[i][j][k]%=mod;//空处和1个处
}
long long ans=;
for(long long j=;j<=m;j++)
for(long long k=;j+k<=m;k++)
ans+=f[n][j][k],ans%=mod;
printf("%d",ans);
return ;
}
最新文章
- [ASP.NET MVC 小牛之路]16 - Model 验证
- MySQL学习笔记十二:数据备份与恢复
- Java基础之如何解决斗地主问题
- Entity Framework 实体框架的形成之旅--Code First的框架设计(5)
- ReCap 360 photo照片建模技术的又一个例子
- cvte 面试实习经历
- Nodepad plus plus--打开时显示“This software need elevation.";";Exception 1002";
- IE=EmulateIE8和IE=IE8的区别
- C++实现数字媒体二维图像变换
- Linux命令行程序和内建指令
- iOS 制作 framework 教程
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
- Java实现Map集合二级联动
- org.springframework.web.util.WebUtils.isSameOrigin(WebUtils.java:816)
- 代码重定位和位置无关码——运行于nor flash
- 007-Redi-命令-脚本命令、链接命令、服务器命令、事务、HyperLogLog
- pig和mysql脚本对比
- ubuntu账户密码正确但是登录不进去系统
- 域名可以解析(ping域名可以获取正确ip),服务器本地telnet 域名+端口 无法连接,通过建立本地虚拟域名指定的方法解决该问题
- robotframwork接口测试(四)—其他库的安装