luogu 2051 [AHOI2009]中国象棋


真是一道令人愉♂悦丧心并框的好题。。。

首先“没有一个炮可以攻击到另一个炮”有个充分条件就是没有三个炮在同一行或同一列。证明:显然。

所以每行/每列最多2个炮。

还有一个点就是任意交换行和列不会改变这个方案的可行性。

那么可以脑补摆完前i行之后就把所有列排个序,会有摆了1个的列,摆了2个的列和没摆的列。

如果是桶排,就记录一下每个有多少就行了。

所以需要3个桶。可以省掉一个,因为知道了总共m列。

那么设f[i][j][k]为摆完了前i行,且j列摆了1个炮,k列摆了2个炮,你摆放的总方案数,然后滚动一下第一维

然后很多种情况,有注释。

PS.要多取膜!!!被坑到了

  1. // It is made by XZZ
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define Fname "cchess"
  6. using namespace std;
  7. #define rep(a,b,c) for(rg int a=b;a<=c;a++)
  8. #define drep(a,b,c) for(rg int a=b;a>=c;a--)
  9. #define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
  10. #define il inline
  11. #define rg register
  12. #define vd void
  13. typedef long long ll;
  14. #define mod 9999973
  15. il int gi(){
  16. rg int x=0;rg bool flg=0;rg char ch=getchar();
  17. while(ch<'0'||ch>'9'){if(ch=='-')flg=1;ch=getchar();}
  18. while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
  19. return flg?-x:x;
  20. }
  21. ll f[2][101][101];
  22. il vd add(ll&a,ll b){a+=b;if(a>=mod)a-=mod;}
  23. int main(){
  24. #ifdef xzz
  25. freopen(Fname".in","r",stdin);
  26. freopen(Fname".out","w",stdout);
  27. #endif
  28. int n=gi(),m=gi(),now=1;
  29. f[0][0][0]=1;
  30. rg ll t;
  31. rep(i,0,n-1){
  32. now^=1;
  33. memset(f[now^1],0,sizeof f[now^1]);
  34. drep(j,m,0)drep(k,m-j,0)if(f[now][j][k]){
  35. t=(f[now][j][k]%=mod);
  36. //第i行
  37. add(f[now^1][j][k],t);//不放
  38. add(f[now^1][j+1][k],t*(m-j-k)%mod);//放一个 新占一列
  39. if(j)add(f[now^1][j-1][k+1],t*j%mod);//放一个 与一列放了一个的放一起
  40. if(m-j-k>1)add(f[now^1][j+2][k],t*(m-j-k)*(m-j-k-1)/2%mod);//放两个 新占两列
  41. if(j&&m-j-k>0)add(f[now^1][j][k+1],t*(m-j-k)*j%mod);//放两个 一个新占一列 另一个与一列放了一个的放一起
  42. if(j>1)add(f[now^1][j-2][k+2],t*j*(j-1)/2%mod);//放两个 都与一列放了一个的放一起
  43. }
  44. }
  45. ll ans=0;
  46. now^=1;
  47. rep(i,0,m)rep(j,0,m-i)add(ans,f[now][i][j]);
  48. printf("%lld\n",ans);
  49. return 0;
  50. }

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

  1. Luogu 2051[AHOI2009]中国象棋 - DP

    Description 在 $n * m$ 的格子上放若干个炮, 使得每个炮都不能攻击到其他炮 Solution 定义数组f[ i ][ j ][ k ] 表示到了第 i 行, 已经有2个炮的列数为 ...

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

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

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

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

  4. luogu P2051 [AHOI2009]中国象棋

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

  5. 洛谷.2051.[AHOI2009]中国象棋(DP)

    题目链接 /* 每行每列不能超过2个棋子,求方案数 前面行对后面行的影响只有 放了0个.1个.2个 棋子的列数,与排列方式无关 所以设f[i][j][k]表示前i行,放了0个棋子的有j列,放了1个棋子 ...

  6. BZOJ1801或洛谷2051 [AHOI2009]中国象棋

    BZOJ原题链接 洛谷原题链接 这题挺难想状态的,刚看题感觉是状压,但数据\(100\)显然不可能. 注意到每行每列只能放\(0\sim 2\)个棋子,所以我们可以将这个写入状态. 设\(f[i][j ...

  7. Luogu P2051[AHOI2009]中国象棋【dp】By cellur925

    题目传送门 题目大意:给定一个$n*m$的棋盘,求放三个“炮”使它们不共行也不共列的方案数.($n,m$$<=100$) 这题主要是转移比较困难,因为情况比较多,所以需要冷静大胆细心地进行分情况 ...

  8. 洛谷2051 [AHOI2009]中国象棋

    题目链接 题意概述:n行m列棋盘放若干个棋子每行每列最多两个求方案总数,答案对9999973取模. 可以比较容易看出这是个dp,设f[i][j][k]表示前i行j列放1个棋子k列放2个棋子的方案总数. ...

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

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

随机推荐

  1. indexzero/http-server-2-使用

    所以在ethereumjs-vm/examples/run-transactions-simple例子中要怎么使用http-server 1.首先在ethereumjs-vm/examples/run ...

  2. Convolution1D与Convolution2D区别

    以下是Convolution1D的例子: # apply a convolution 1d of length 3 to a sequence with 10 timesteps, # with 64 ...

  3. servlet入门与进阶

    servlet入门与进阶 1.servlet基础认知 Servlet(Server Applet):全称Java Servlet,是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据, ...

  4. POJ 1157 LITTLE SHOP OF FLOWERS (超级经典dp,两种解法)

    You want to arrange the window of your flower shop in a most pleasant way. You have F bunches of flo ...

  5. C#中枚举

    1.枚举是一组命名整形常量,枚举类型使用Enum关键字进行声明的.在C#中枚举是值数据类型,枚举包含自己的值,且不能继承或传递继承.

  6. iOS 封装一个带复制功能的UILabel

    我们发现UILabel不在为我们提供长按弹出复制等操作了, 我们来继承UILabel自己写一个带复制功能的UILabel. 代码: #import "CopyLabel.h" @i ...

  7. css模型框

    在 CSS 中,width 和 height 指的是内容区域的宽度和高度.增加内边距.边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸. 假设框的每个边上有 10 个像素的外边距和 5 个 ...

  8. 对于PHP绘图技术的理解

    要使用PHP绘图,就得在php.ini文件中设置一下 找到这个位置 ;extension=php_gd2.dll,然后把前面的分号去掉,重启下apache就可以了 几乎每行代码我都写了注释,方便看懂 ...

  9. Linux常用命令拾遗

    查看端口对应的程序: netstat -nlap | grep 5004 输出: tcp 0 0 192.168.3.000:5004 192.118.201.00:50800 ESTABLISHED ...

  10. html网站meta标签大全

    案例 一.天猫 <meta charset="utf-8"> <title>天猫TMALL</title> <meta name=&quo ...