题目描述

这次小可可想解决的难题和中国象棋有关,在一个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

动态规划(组合数+状压,选择合理的状态)

见代码(感谢 @何旭):

 #include<cstdio>
 using namespace std;
 #define mod f[i][j][k]%=9999973
 int n,m;
 ][][];
 long long calc(int x)
 {
     )>>;
 }
 /*
 发个题解,但是我并不打算发程序,下面的程序够详细了,我只是补个思想讲解
 F[I][J][K] 表示已经放了前I行,其中有J列是只放了1个炮,有K列放了2个炮的方案数
 有:(已第三方订正)
 1〉如果第I行不放,有
     F[i][J][K]+=+F[I-1][J][K];
 2〉如果第I行放一个棋子,且这个棋子放在已经放了一个棋子的列上,有
     F[I][J][K]+=F[I-1][J+1][K-1]*(J+1);
 3〉如果第I行放一个棋子,且这个棋子放在已放了0个棋子的列上,有:
     F[I][J][K]+=F[I-1][J-1][K]*(M-J-K+1);
 4〉如果第I列放两个棋子,且两个棋子都放在空列上,有:
     F[I][J][K]+=F[i-1][J-2][K]*(M-J+2-K)*(M-J+1-K) DIV 2;
 5〉如果第I列放两个棋子,且两个棋子一个放在已经放了一个棋子的列,另一个放在放了0个棋子的列。有
     F[I][J][K]+=F[I-1][J+2][K-2]*(J+2)*(J+1)DIV 2 ;
 6〉如果第I列放两个棋子,且这两个棋子都放在已经放过1个棋子的列上,有:
     F[I][J][K]+=F[I-1][J][K-1]*J*(M-J-K+1);
 7〉 F[I][J][K] 的每次累计必须mod 9999973;
 */
 int main()
 {
     scanf("%d%d",&n,&m);
     f[][][]=;
     ; i<=n; i++) {
         ; j<=m; j++) ; k<=m-j; k++) {
                 f[i][j][k]=f[i-][j][k];
                 ) f[i][j][k]+=f[i-][j-][k]*(m-j-k+),mod;
                 ) f[i][j][k]+=f[i-][j+][k-]*(j+),mod;
                 ) f[i][j][k]+=f[i-][j-][k]*calc(m-j+-k),mod;
                 ) f[i][j][k]+=f[i-][j+][k-]*calc(j+),mod;
                 ) f[i][j][k]+=f[i-][j][k-]*j*(m-j-k+),mod;
             }
     }
     ;
     ; i<=m; i++) {
         ; j<=m; j++)
             ans+=f[n][i][j],ans%=;
     }
     printf("%lld\n",ans);
 }

P2051 [AHOI2009]中国象棋的更多相关文章

  1. 洛谷 P2051 [AHOI2009]中国象棋 解题报告

    P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...

  2. 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP

    P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...

  3. Luogu P2051 [AHOI2009]中国象棋(dp)

    P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...

  4. [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...

  5. [洛谷P2051] [AHOI2009]中国象棋

    洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ...

  6. [P2051 [AHOI2009]中国象棋] DP

    https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...

  7. 洛谷 P2051 [AHOI2009]中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  8. P2051 [AHOI2009]中国象棋——DP(我是谁,我在哪,为什么)

    象棋,给你棋盘大小,然后放炮(炮的数量不限),不能让炮打到其他的炮,问方案数: 数据n,m<=200; 状态压缩似乎能做,但是我不会: 因为只要状态数,所以不必纠结每种状态的具体情况: 可以想出 ...

  9. luogu P2051 [AHOI2009]中国象棋

    统计方案,果断 dp 注意到合法方案即为每一行,每一列的棋子数不超过2 设\(f_{i,j,k}\)表示放到第\(i\)行,有\(j\)列可以放2个,有\(k\)列可以放1个的方案 然后就随便讨论一下 ...

随机推荐

  1. 使用OLAMISDK实现一个语音输入数字进行24点计算的iOS程序

    前言 在目前的软件应用中,输入方式还是以文字输入方式为主,但是语音输入的方式目前应用的越来越广泛.这是一个利用 Olami SDK 编写的一个24点iOS程序,是通过语音进行输入. Olami SDK ...

  2. HTML5中表单中新增加元素

    新增input 内属性 1,required:若文本内容为空,阻止表单提交格式,写入单词即可 如:<input type="text" name="username ...

  3. 企业微信开发之向员工付款(C#)

    一.企业微信API 地址:http://work.weixin.qq.com/api/doc#11545 二.参数说明 1.向员工付款 请求方式:POST(HTTPS)请求地址:https://api ...

  4. 使用脚本监控windows服务的方法

    以下脚本可监控某一个windows服务,发现其停止就立即重启之. @echo off rem 定义循环间隔时间和监测的服务: set secs=60 set srvname="NetWin ...

  5. JQuerymobile实例源代码

    首页我们先来解释一下下JQuerymobile是什么,jQuery Mobile是JQuery 框架的一个组件(而非jquery的移动版本).jQuery Mobile是一款基于HTML5的用户界面系 ...

  6. LeetCode 152. Maximum Product Subarray (最大乘积子数组)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  7. Svn———搭建及配置

    一.Svn介绍 subversion(简称svn)是近几年崛起的版本管理软件,是cvs的接班人,目前绝大多数开源软件都使用svn作为代码版本管理软件.Subversion支持linux和windows ...

  8. 数据分析与展示——NumPy库入门

    这是我学习北京理工大学嵩天老师的<Python数据分析与展示>课程的笔记.嵩老师的课程重点突出.层次分明,在这里特别感谢嵩老师的精彩讲解. NumPy库入门 数据的维度 维度是一组数据的组 ...

  9. Xilinx ISE14.1用Verilog语言实现一个半加器并测试

    <一>建立一个工程 注:Xilinx ISE的安装在此不再过多说明,网上有参考资料 1.打开软件进入如下界面 2.创建工程 File-->New Project 3.创建文件(我取名 ...

  10. Python面向对象篇之元类,附Django Model核心原理

    关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一 ...