博弈论---Nimk问题。 dp再搞搞。

很容易看出,该游戏的终态是每两个棋子都紧靠着。当一颗棋子移动,另一方与该棋子对应的那一刻可以立即追上,使得仍旧紧靠,最终棋子动弹不得,游戏结束。

还能看出,对于白色棋子(先手),往左走没有意义。因为黑子(后手)可以紧随其上使得两者距离不变。同理黑子只往左走。(黄学长貌似提出了反例?)

所以,问题可以抽象为Nim,与传统Nim只能选1堆不同,你可以选1-d堆。

这个拓展问题叫做Nimk问题。对于这种问题,我们可以证明:当将n堆棋子化为二进制,每一位上如果1的个数mod(k+1)==0 则为必败态。

详细证明,大传送术!http://blog.csdn.net/weixinding/article/details/7321139

最后只需要计算方案数。使用dp,dp[i][j]表示当前在二进制第i位上,总计用了j石头的方案。转移方程为:

dp[i+1][j+a*(k+1)*bin[i]]+=dp[i][j]*C(n,a*(k+1));

注意组合数处理,取%等细节即可。

 1 #include<bits/stdc++.h>2 using namespace std;3 #define mo 10000000074 #define N 100055 #define LL long long6 LL c[N][205],dp[20][N],ans;7 int n,k,d,K,bin[20];8 void pre(){9     bin[0]=1; for(int i=1;i<=15;i++) bin[i]=bin[i-1]<<1;
10     for(int i=0;i<=n;i++) c[i][0]=1; 11 for(int i=1;i<=n;i++) 12 for(int j=1;j<=min(i,K);j++) 13 c[i][j]=(c[i-1][j]+c[i-1][j-1])%mo; 14 } 15 LL C(int n,int m){ 16 if(n-m<m) m=n-m; 17 return c[n][m]; 18 } 19 LL cal(LL& x,LL y){ 20 x=(x+y)%mo; 21 } 22 int main(){ 23 scanf("%d%d%d",&n,&K,&d); pre(); dp[0][0]=1; 24 for(int i=0;i<15;i++) 25 for(int j=0;j<=n-K;j++) 26 for(int k=0;k*(d+1)<=K/2 && j+k*(d+1)*bin[i]<=n-K;k++) 27 cal(dp[i+1][j+k*(d+1)*bin[i]],dp[i][j]*C(K/2,k*(d+1))); 28 for(int i=0;i<=n-K;i++) 29 cal(ans,dp[15][i]*C(n-i-K/2,K/2)); 30 LL tot=C(n,K); 31 cout<<(tot-ans+mo)%mo; 32 return 0; 33 }

转载于:https://www.cnblogs.com/enigma-aw/p/5953207.html

【bzoj2281】[Sdoi2011]黑白棋相关推荐

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

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

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

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

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

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

  4. bzoj 2281: [Sdoi2011]黑白棋 bzoj 4550: 小奇的博弈(Nimk博弈+DP)

    4550: 小奇的博弈 Time Limit: 2 Sec  Memory Limit: 256 MB Submit: 68  Solved: 42 [Submit][Status][Discuss] ...

  5. 51nod 1368:黑白棋 二分图最大匹配

    1368 黑白棋 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  取消关注 有一个N*M的棋盘(1<=N,M< ...

  6. 《算法竞赛入门经典》习题4-3 黑白棋(Othello, ACM、ICPC World Finals 1992, UVa220)

    原题及翻译 Othello is a game played by two people on an 8 x 8 board, using disks that are white on one si ...

  7. android 双人黑白棋开发博客,黑白棋 - 软件资讯 - 课堂党年级博客

    黑白棋叫反棋(Reversi).奥赛罗棋(Othello)苹棋翻转棋黑白棋西本流行游戏通相互翻转棋棋盘谁棋判断胜负 黑白棋棋盘8*8格棋盘棋棋空格间像围棋交叉点始棋盘两白两黑四棋交叉放置黑棋总先 自颜 ...

  8. 从0开始 Java实习 黑白棋

    黑白棋的设计 代码如下: import java.util.*; public class Chess{char[][] chess = new char[16][16];public static ...

  9. MFC随机博弈黑白棋

    随机博弈黑白棋 随机博弈黑白棋 TxyITxs | 随机博弈黑白棋 | 2019.04.21 摘要 通过随机落子,实现黑白棋的博弈.无任何落子规则,棋子死活与围棋中棋子的死活一致,即存在至少一口气.动 ...

最新文章

  1. 11g RMAN Restore archivelog用法
  2. 针对ie6的一些小总结
  3. 方差、标准差、均方差、均方误差理解
  4. 【SpringBoot】添加自定义浏览器图标 favicon.ico
  5. python中if嵌套语句的作用_讲解Python中if语句的嵌套用法
  6. android onscrolllistener判断到底部,判断RecyclerView是否滑动到底部
  7. Day02-变量_数据类型和运算符
  8. Classic ASP 系列(3) Application 对象
  9. Java 发送 Http请求工具类
  10. ios客户端快速滚动和回弹效果的实现
  11. 终端花屏后的恢复办法
  12. 视觉三维重建中的关键技术及代码实现视频分享
  13. URDGN:Ultra-resolve Face Images by Discriminative Generative Networks
  14. 单线程模型中Message、Handler、Message Queue、Looper之间的关系
  15. 职场达人教你如何做高效工作汇报!
  16. 如何使用Apple Watch启动和跟踪锻炼
  17. 机械键盘改罗技优联无线键盘
  18. 【Android视频 之 阿里云视频播放器 二】
  19. 【Eclipse】--Eclipse简介和安装
  20. Excel中《分列》高效到爆的用法,8个案例,太实用了!

热门文章

  1. PyQt5-高级控件使用(QTableView)
  2. Ruby on Rails开发Web应用的基本概念
  3. (转载)uCOS-II的嵌入式串口通信模块设计
  4. 软件构架实践_阅读笔记01(1-3)
  5. HDU-1232 畅通工程
  6. 诗与远方:无题(四十)
  7. python实现图片找不同游戏_用Python实现谷歌的小恐龙游戏
  8. ubuntu java环境变量_ubuntu配置java环境变量
  9. 负载均衡的几种方式_负载均衡的几种方式
  10. Qt在线/离线安装包下载网址和说明