【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)

题面

BZOJ

洛谷

题解

先看懂这题目在干什么。

首先BZOJ上面的题面没有图,换到洛谷看题就有图了。

不难发现都相邻的两个异色棋子放在一起的时候,此时的先手无论怎么动,后手直接把棋子靠上去,这样子一定是先手先无法移动。即先手必败。

把相邻的黑白棋子配对,不难发现这个玩意就是一个\(NimK\)游戏了。

考虑\(NimK\)游戏是怎么来的,即把每堆石子转为二进制之后,检查是否每一位上的棋子数量都是\(K+1\)的倍数,如果是,则先手必败。否则先手必胜。

那么这样子可以\(dp\)了。

设\(f[i][j]\)表示当前考虑到了二进制上的第\(i\)位,总共放了\(j\)个石子的先手必败的方案数。

这样子用总的放置方案数减去必败的方案数就可以得到必胜的方案数了。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define ll long long
  5. #define MAX 10010
  6. #define MOD 1000000007
  7. void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
  8. int jc[MAX],jv[MAX],inv[MAX];
  9. int C(int n,int m){if(m>n)return 0;return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
  10. int f[15][MAX],n,K,d,ans;
  11. int main()
  12. {
  13. scanf("%d%d%d",&n,&K,&d);
  14. n-=K;K>>=1;jc[0]=jv[0]=inv[0]=inv[1]=1;
  15. for(int i=1;i<=n+K+K;++i)jc[i]=1ll*jc[i-1]*i%MOD;
  16. for(int i=2;i<=n+K+K;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
  17. for(int i=1;i<=n+K+K;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;
  18. f[0][0]=1;
  19. for(int j=0;j<=13;++j)
  20. for(int i=0;i<=n;++i)
  21. if(f[j][i])
  22. for(int k=0;k<=K;k+=d+1)
  23. if(i+(1<<j)*k<=n)add(f[j+1][i+(1<<j)*k],1ll*f[j][i]*C(K,k)%MOD);
  24. for(int i=0;i<=n;++i)add(ans,1ll*f[14][i]*C(n-i+K,K)%MOD);
  25. ans=(C(n+2*K,2*K)+MOD-ans)%MOD;
  26. printf("%d\n",ans);
  27. return 0;
  28. }

【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)的更多相关文章

  1. BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)

    Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...

  2. luoguP2490 [SDOI2011]黑白棋 博弈论 + 动态规划

    博弈部分是自己想出来的,\(dp\)的部分最后出了点差错QAQ 从简单的情况入手 比如\(k = 2\) 如果有这样的局面:$\circ \bullet $,那么先手必输,因为不论先手怎样移动,对手都 ...

  3. [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 626  Solved: 390[Submit][Status][ ...

  4. BZOJ2281[Sdoi2011]黑白棋&BZOJ4550小奇的博弈——DP+nimk游戏

    题目描述 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色 ...

  5. BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)

    怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...

  6. bzoj2281 [Sdoi2011]黑白棋

    一眼$nimk$游戏,后来觉得不对劲,看了黄学长博客发现真的不是$nimk$. 就当是$nimk$做吧,那么我们要保证每一位上一的个数都是$d+1$的倍数. $dp$:$f[i][j]$表示从低到高第 ...

  7. BZOJ2281 [SDOI2011]黑白棋 【dp + 组合数】

    题目 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色棋子 ...

  8. Bzoj 2281 [Sdoi2011]黑白棋 题解

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 592  Solved: 362[Submit][Status][ ...

  9. P2490 [SDOI2011]黑白棋

    P2490 [SDOI2011]黑白棋 题意 一个 \(1*n\) 的棋盘上,A 可以移动白色棋子,B 可以移动黑色的棋子,其中白色不能往左,黑色不能往右.他们每次操作可以移动 1 到 \(d\) 个 ...

随机推荐

  1. Window环境下配置MySQL 5.6的主从复制

    原文:Window环境下配置MySQL 5.6的主从复制 1.环境准备 Windows 7 64位 MySQL 5.6 主库:192.168.103.207 从库:192.168.103.208 2. ...

  2. Ionic Contoller类与Service类分开需要注意的问题

    看了别人的项目把Controller类和Service类都写在了app.js文件里面,这不符合我的风格,想把他们分开成单独的文件,确遇见以下错误提示: ionic.bundle.min.js:133 ...

  3. java 基础02 打包package

  4. GitFlow原理浅析

    一.Git优点 分布式存储 , 本地仓库包含了远程仓库的所有内容 . 安全性高 , 远程仓库文件丢失了也不怕 优秀的分支模型 , 创建/合并分支非常的方便 方便快速 , 由于代码本地都有存储 , 所以 ...

  5. keepalived概述

    一.HA集群中的相关术语 1.节点(node) 运行HA进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和高可用软件服务,在高可用集群中,节点有主次之分,分别称之为主节 ...

  6. Visual Studio 2015的安装及单元测试练习

    第一部分:Visual Studio 2015的安装 我电脑系统是win10,所以安装的是Visual Studio 2015,安装步骤部分截图如图所示: 1.安装类型选项界面:可以选择默认安装,可以 ...

  7. Linux内核及分析 第五周 扒开系统调用的三层皮(下)

    实验内容: 1.执行rm menu -rf命令,强制删除原有的menu 2.使用git命令 git clone https://github.com/mengning/menu.git 克隆新的men ...

  8. JMX configuration for Tomcat

    Window下执行步骤: D:\apache-tomcat-7.0.57\bin\catalina.bat set CATALINA_OPTS=-Dcom.sun.management.jmxremo ...

  9. OneZero——Review报告会

    1. 时间: 2016年4月20日. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http://www.cnb ...

  10. 应用层协议及ip地址划分

    1.应用层协议 2.ip地址 3.子网划分及超网合并