题目描述

这次小可可想解决的难题和中国象棋有关,在一个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. 【原创】自用css reset

    自己工作中常用的reset,和一些设置,实际用时会根据网站页面进行增删. /* Common style */html{ overflow-y:scroll; overflow-x:auto;}bod ...

  2. chromium源码阅读--Browser进程初始化

    最近在研读chromium源码,经过一段懵懂期,查阅了官网和网上的技术文章,是时候自己总结一下了,首先IPC message loop开始吧,这是每个主线程必须有的一个IPC消息轮训主体,类似之前的q ...

  3. git学习整理(1)git clone 理解

    1.git clone 的理解 git clone默认会把远程仓库整个给clone下来 ,只能clone远程库的master分支并在本地默认创建一个master分支 ,无法clone所有分支,若想要其 ...

  4. 进程池与线程池(concurrent.futures)

    from concurrent.futures import ProcessPoolExecutor import os,time,random def task(n): print('%s is r ...

  5. Tracker-store

    升级后发现有个tracker-store占用cpu非常厉害,查了下,好像是GNOME 3使用 Documents 來整合 本机 以及 在线(Google / Twitter)账户的文件,这个功能会呼叫 ...

  6. C#导出.csv格式的excel表

    .cs文件直接贴代码: using System; using System.Collections.Generic; using System.Data; using System.IO; usin ...

  7. Linux.杀毒.Centos安装杀毒软件Clam

    Linux系统用了几年, 甚少中毒 但前不久在阿里云的服务器被种马,折腾了几周才解决干净 感觉还是装个杀毒/马软件定期扫一扫比较稳妥, 这个Clam是免费的, 安装和配置办法记录如下: 已验证适用环境 ...

  8. vue.js快速搭建图书管理平台

      前  言 上一期简单讲解了vue的基本语法,这一次我们做一个小项目,搭建一个简单的图书管理平台,能够让我们更深刻的理解这门语言的妙用.   1.DEMO样式 首先我们需要搭建一个简单的demo样式 ...

  9. python matplotlib 图表局部放大

    import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes ...

  10. Connections between cities

    Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...