[AHOI2009]中国象棋

【01】Python解释器的安装 工欲善其事必先利其器。君欲学PYthon,则必先安装Python解释器。安装过程相对简单,大致跟着如下步骤走即可。 阅读详情

题目描述

这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。你也来和小可可一起锻炼一下思维吧!

输入输出格式

输入格式:

一行包含两个整数N,M,之间由一个空格隔开。

输出格式:

总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果。

输入输出样例

输入样例#1: 复制
1 3
输出样例#1: 复制
7

说明

样例说明

除了3个格子里都塞满了炮以外,其它方案都是可行的,所以一共有2*2*2-1=7种方案。

数据范围

100%的数据中N和M均不超过100

50%的数据中N和M至少有一个数不超过8

30%的数据中N和M均不超过6

题解:

DP

f[i][j][k]表示前i行有j列放了1个炮,k列放了2个炮

转移:

不放炮f[i-1][j][k]

在1个空列放炮f[i-1][j-1][k]*(m-k-j+1)

在一个有一个炮的列放炮f[i-1][j+1][k-1]*(j+1)

在两个空列分别放炮f[i-1][j-2][k]*(m-j-k+2)*(m-j-k+1)/2

在一个空列一个有炮的列放炮f[i-1][j][k-1]*(m-j-k+1)*j

在两个有炮的列f[i-1][j+2][k-2]*(j+2)*(j+1)/2;

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=110;
long long f[maxn][maxn][maxn];
const int mod=9999973;
inline long long mo(long long x){
    return (x%mod+mod)%mod;
}
int main(){
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    int n,m;
    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<=m;k++){
                if(j+k>m)
                    break;
                f[i][j][k]=mo(f[i-1][j][k]+f[i][j][k]);
                if(j)
                    f[i][j][k]=mo(f[i][j][k]+f[i-1][j-1][k]*(m-k-j+1));
                if(j<m&&k)
                    f[i][j][k]=mo(f[i][j][k]+f[i-1][j+1][k-1]*(j+1));
                if(j>=2)
                    f[i][j][k]=mo(f[i][j][k]+f[i-1][j-2][k]*((m-k-j+2)*(m-k-j+1)/2));
                if(k)
                    f[i][j][k]=mo(f[i][j][k]+f[i-1][j][k-1]*(m-k-j+1)*j);
                if(j+2<=m&&k>=2)
                    f[i][j][k]=mo(f[i][j][k]+f[i-1][j+2][k-2]*((j+2)*(j+1)/2));
            }
    long long ans=0;
    for(int i=0;i<=m;i++)
        for(int j=0;j<=m;j++)
            ans=mo(ans+f[n][i][j]);
    printf("%lld\n",(ans%mod+mod)%mod);
return 0;
}


QGIS编译(跨平台编译)之五十六:QScintilla编译、QScintilla安装(Windows、Linux、MacOS环境下编译、安装) QGIS编译;QScintilla编译、QScintilla安装(Windows、Linux、MacOS环境下编译、安装) 阅读详情

相关推荐

存内计算路线再获加持,清华存内芯片登Science

通过这种方法,可以比较有效的控制二氧化铪忆阻层中的微观变化,以及内部的温度和电场,使得器件具有非常优异的电学特性,而且可以在工厂里大规模生产,推动了高性能忆阻器阵列的诞生。团队搭建了全硬件构成的完整存算一体系统,如下图7所示,在系统里集成了多个忆阻器阵列,并在该系统上高效运行了卷积神经网络算法,成功验证了图像识别功能,证明了存算一体架构全硬件实现的可行性,并且成功实现了以更小的功耗和更低的硬件成本完成复杂的计算[6]。根据测试,在一般神经网络中权重更新的最后阶段,调整步长非常接近0,如图9(C)所示,

PXX12345678的博客 1555

P2051 [AHOI2009] 中国象棋(dp)

你也来和小可可一起锻炼一下思维吧!1.都放在有0个棋子的列:dp[i][j][k]+=dp[i-1][j-2][k]*getc(m-k-j+2,2,9999973);2.都放在有1个棋子的列:dp[i][j][k]+=dp[i-1][j+2][k-2]*getc(j+2,2,9999973)3.一个放在有0个的一个放在有一个的:dp[i][j][k]+=dp[i-1][j][k-1]*j*(m-j-k+1)1.放在有0个炮的列上:dp[i][j][k]+=dp[i-1][j-1][k]*(m-j-k+1)

qq_61903556的博客 404

虚幻引擎5 AR开发教程02:构建和测试AR Android App

在本教程中,我们将学习如何在虚幻引擎 5 上构建和测试 AR 安卓应用。

mopanchun的博客 2650

中国象棋 洛谷 P2051 [AHOI2009]

与经典的国王问题不同,我们不需要记录每种情况棋盘的具体状况,我们只用记录下该情况中各种炮数目的行数为多少。我们定义dp[i][j][k],表示前i层中,有一个炮的行数为j,两个炮的行数为k,则没有炮的行数为m-j-k。每一次行动时,我们有三种操作,不放棋子,放一个,放两个。放两个棋子又分为三种情况:两个均放在没棋子的列上,一个在没棋子的列上一个在有一个的列上,两个都在有一个的列上。由于“炮打翻山”的攻击特性,我们可以知道在棋盘中的任意一列或是任意一行上,最多只能有两个炮存在。其中C2(x)函数即组合数。

RaedQm的博客 488

智能变电站协议系列-1、GOOSE、SV、MMS协议简介及GOOSE示例运行问题(IEC61850)

目前有一个新的研究,关于电网使用的GOOSE、SV、MMS协议,并使用相关库来做一下测试。由于goose、sv、mms等都属于IEC61850,因此,需要对IEC61850相关内容有一些了解,都是国际标准,属于电气自动化的一部分,对于自动化或者电气相关领域有接触的专业应该或多或少有一些了解。IEC61850目标是用于变电站自动化、分布式能源、水力和天然气发电厂、风力发电厂、电动汽车作为分布式能源等领域,目前似乎在变电站自动化方面的推广和使用更加广泛。

逍遥游的博客 2万+

新手网工别慌!手把手带你搞定华为OLT开局配置(从登录到业务下发全流程)

本文为新手网络工程师提供华为OLT设备开局配置的详细指南,涵盖从设备登录、基础配置到业务部署的全流程。通过实战案例和常见问题排查,帮助读者快速掌握华为OLT配置技巧,确保业务顺利开通。

weixin_33721344的博客 481

题解 洛谷 P2051 [AHOI2009]中国象棋

洛谷 P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好有一个棋子。你也来和小可可一起锻炼一下思维吧! 输入输出格式 输入格式: 一行包含...

weixin_44577381的博客 273

学习记录-Simpack生成车轮不圆的几种示例

单阶、多阶和实测车轮多边形的添加教程

weixin_51965897的博客 3706

BZOJ 1801 AHOI2009 中国象棋 递推

题目大意:给定一个棋盘,放置一些炮,要求任意两个炮不能互相攻击,求方案数对p取模的值 首先任意两个炮不互相攻击等价于一条线上最多只能有两个炮 直接状压DP的话是50分 考虑到每一列都是等价的 那么我们可以直接递推 令f[i][j][k]为前i行有j列有一个炮 k列有两个炮 那么讨论 这行不放炮 方案数为f[i-1][j][k] 在原先没有炮的列放炮 方案数为f[i-1][j-1][k

世界 2806

恶意代码分析实战——使用Apatedns和Inetsim模拟网络环境

恶意代码分析实战——使用Apatedns和Inetsim模拟网络环境 注:本次实验主要是《恶意代码分析实战》一书中进入动态恶意代码分析篇章的开始,主要通过Apatedns以及Inetsim来模拟为恶意代码提供其需要的网络环境,本次实验以Lab01-03.exe为例。 一、实验环境及工具。 Vmware虚拟机:win10(win7)、kali 主要工具:Apatedns、Inetsim 二、工具的安装下载 1、Apatedns:需安装至windows虚拟机客户端(win10,win7均可) 下载地址:http

妙蛙种子吃了都会妙妙秒的妙脆角的博客 7935

【人工智能】拒绝焦虑,理性突围:AI 时代 Java 工程师的职业重构与进化指南

摘要:在AI技术快速发展的背景下,Java工程师面临职业转型挑战。本文通过MECE原则解构工作内容,划分高替代风险区(如CRUD开发)、高增效潜能区(如逻辑优化)和高核心壁垒区(如架构设计),指出AI对不同任务的影响程度。从劳动经济学视角分析行业将呈现K型分化,初级执行者被替代,而精通AI协作的全栈工程师需求增长。文章强调警惕过度依赖AI导致认知能力退化,并提出转型路径:掌握AI驱动开发(AIDD)、深耕领域驱动设计(DDD)、拓展全流程能力及AI原生应用开发。最终结论指出,未来的核心竞争力在于结合AI工具

奶爸的编程之路,也就一周冷个三天 133

【AHOI2009】中国象棋

【题目链接】            点击打开链接【算法】         动态规划         f[i][j][k]表示前i行,有j列放了1个,有k列放了两个         分六种情况讨论即可【代码】           #include&lt;bits/stdc++.h&gt; using namespace std; #define MAXN 110 const long long MO...

even_bao的博客 515

手把手教你完成YOLOv8 PyQt5和PySide6目标检测界面搭建,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。YOLO系列模型由于其高效的检测速度和较高的准确率,成为目标检测任务的首选算法之一。本项目结合 YOLOv8 与 PyQt5,构建了一个图形化界面,便于用户进行目标检测的操作和展示,实现对图片、视频和摄像头的实时目标检测,不仅可以用于大论文的工作量展示,还可以作为毕业设计。支持目标检测、目标分割等模型进来检测

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

【bzoj1801】[AHOI2009]中国象棋 [动态规划]

2051[AHOI2009]中国象棋 开始瓜想状压 发现n≤100压个P 分情况来讨论 利用乘法原理和加法原理 f[i][j][k]放第i行当前只有一个棋子的有j列 有两个棋子的有k列 #include<bits/stdc++.h> using namespace std; #define Max(x,y) (x)<(y)?(y):(x) #define Mi...

weixin_30553065的博客 150

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[luogu]P2051 [AHOI2009]中国象棋

原题链接:P2051 [AHOI2009]中国象棋 题意 炮能隔一个棋子打人,求一个棋盘上放置炮的合法方案数(炮不互相攻击)。 分析 既然求方案数那应该就是dp(神仙言论),以前做过很多类似的状压DP,这个题很直观的三进制状压啊。。 看看范围。。。 $n/le 100$。溜了溜了此题无解 理性分析一波,发现一行一列最多放三个炮(废话),那么状态设计就挺简单了。 首先肯定是...

Myka1991的博客 226

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Bzoj 1081 [Ahoi2009] chess 中国象棋

bzoj 1081 [Ahoi2009] chess 中国象棋 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1801 状态比较难设,的确没想到. 不关心第几列出现是否出现了棋子的个数.而是看看上一行第几列出现了1或2个棋子 利用组合巧妙解决问题. 设\(f[i][j][k]\)表示第i行有j列有1个棋子.有k行有2个棋子. ...

dieloupi0136的博客 158

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

luogu 2051 [AHOI2009]中国象棋

luogu 2051 [AHOI2009]中国象棋 真是一道令人愉♂悦丧心并框的好题。。。 首先“没有一个炮可以攻击到另一个炮”有个充分条件就是没有三个炮在同一行或同一列。证明:显然。 所以每行/每列最多2个炮。 还有一个点就是任意交换行和列不会改变这个方案的可行性。 那么可以脑补摆完前i行之后就把所有列排个序,会有摆了1个的列,摆了2个的列和没摆的列。 如果是桶排,就记录一下每个有多少就行了。...

weixin_30652271的博客 80

BZOJ_1801_[Ahoi2009]chess 中国象棋_DP

BZOJ_1801_[Ahoi2009]chess 中国象棋_DP Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较大,输出其mod 9999973 Sampl...

114

P2051 [AHOI2009] 中国象棋(dp)

dp

Harris-H的博客 407

AHOI 2009 中国象棋

题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。你也来和小可可一起锻炼一下思维吧! 输入输出格式 输入格式: 一行包含两个整数N,M,之间由一个空格...

dk810510的博客 178

AHOI2009 中国象棋

题目链接 题目描述 在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。 (在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。) 输入输出格式 输入格式: 一行包含两个整数N,M,之间由一个空格隔开。 输出格式: 总共的方案数,由于该值可能很大,只需给出方案数模9999973的结...

Flowers 118

【DP】[AHOI2009]中国象棋

给出一个网格,现在求每行每列放置不超过两个物品的方案数

blog 123
上一篇: bzoj2243: [SDOI2011]染色
下一篇: luoguP2279 [HNOI2003]消防局的设立
Ostmbh
博客等级 码龄10年 10粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值