当前位置: 首页 > news >正文

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

2281: [Sdoi2011]黑白棋

Time Limit: 3 Sec  Memory Limit: 512 MB
Submit: 626  Solved: 390
[Submit][Status][Discuss]

Description

小A和小B又想到了一个新的游戏。
这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色。
最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同。
小A可以移动白色棋子,小B可以移动黑色的棋子,他们每次操作可以移动1到d个棋子。
每当移动某一个棋子时,这个棋子不能跨越两边的棋子,当然也不可以出界。当谁不可以操作时,谁就失败了。
小A和小B轮流操作,现在小A先移动,有多少种初始棋子的布局会使他胜利呢?

Input

共一行,三个数,n,k,d

Output

输出小A胜利的方案总数。答案对1000000007取模。

Sample Input

10 4 2

Sample Output

182

HINT

 1<=d<=k<=n<=10000, k为偶数,k<=100。

Source

stage 2 day1

很有意思的一道博弈题,可惜HZWER学长给出了反例。

那么这一题通过手玩可以发现,最终状态必定是所有棋子全部扎堆在棋盘左端或右端,棋子之间没有间隙。不过仔细观察可以发现,可能在游戏状态中会出现所有棋子扎堆但不在棋盘一端的情况,其实那个时候就已经决定了最终的胜负。因为只要一方朝自己来的方向走了,则另一方必定能也往那边走一步,最终会步步紧逼直到走到棋盘一端。

根据这一点,感性理解一下,这个游戏就是一个把对方棋子“怼”过去的过程,谁怼赢了就是胜者。所以从一开始双方都一定拼尽全力往对面怼,所以有一个结论:先手不可能往左走,后手不可能往右走。

这样这个问题就变成了一个取石子游戏,每对相邻的白子和黑子之间的格子数是石子数(显然共有K/2堆石子),每人每次选不超过k堆取一个石子。

这个问题叫K-Nim,结论是:将所有石子数转成二进制,如果对于每一位二进制,这一位上为1的石子堆数都能被k+1整除则为必败态,否则为必胜态。

证明主要思路是: 1.最终态二进制每一位都为0必为必败态。2.只要有某位的1的个数不被k+1整除,则必然有一种走法使每一位都被整除。 3.如果每一位都被k+1整除,则无论怎么走都不可能使得每一位都仍然能被整除。

这三点分别保证了:最终态是必败态。必胜态必定能走到必败态。必败态只能走到必胜态。

详细证明:http://blog.csdn.net/weixinding/article/details/7321139

这样,我们分别用了“寻找最终态”和“模仿”的技巧将问题转化为了K-Nim问题。回到这一题,最终答案=总方案数-必败态的方案数。

设$f_{i,j}$表示前$i$个二进制位共放了$j$个石子的方案数,则$$ans=C_n^K-\sum_{i=0}^{n-K} f_{s,i}*C_{n-i-K/2}^{K/2}$$s为最高位的1,这里取15就够了。

考虑$f$的转移方程即可:$$f_{i+1,j+k*(d+1)*(1<<i)}\ \ +=\ \ f_{i,j}*C_{K/2}^{k*(d+1)}$$

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define rep(i,l,r) for (int i=l; i<=r; i++)
 5 typedef long long ll;
 6 using namespace std;
 7 
 8 const ll N=10010,mod=1000000007;
 9 ll tot,ans,bin[25],c[N][205],f[25][N];
10 int n,K,d,p;
11 
12 void add(ll &x,ll y){ x=(x+y)%mod; }
13 void pre(){
14     rep(i,0,n) c[i][0]=1;
15     rep(i,1,n) rep(j,1,min(2*K,i)) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
16 }
17 int C(int n,int m){ if (m>n-m) m=n-m; return c[n][m]; }
18 
19 int main(){
20     freopen("bzoj2281.in","r",stdin);
21     freopen("bzoj2281.out","w",stdout);
22     bin[0]=1; rep(i,1,15) bin[i]=bin[i-1]<<1;
23     scanf("%d%d%d",&n,&K,&d); K>>=1;
24     pre(); f[0][0]=1;
25     rep(i,0,14) rep(j,0,n-2*K)
26         for (int k=0; k*(d+1)<=K && j+k*(d+1)*bin[i]<=n-2*K; k++)
27             add(f[i+1][j+k*(d+1)*bin[i]],f[i][j]*C(K,k*(d+1)));
28     rep(i,0,n-2*K) add(ans,f[15][i]*C(n-i-K,K));
29     tot=C(n,K*2); printf("%lld\n",(tot-ans+mod)%mod);
30     return 0;
31 }

 

转载于:https://www.cnblogs.com/HocRiser/p/8583681.html

相关文章:

  • 微信小程序从零开始开发步骤(六)4种页面跳转的方法
  • (独孤九剑)--文件系统
  • Laravel常见问题集锦
  • v0.1beta
  • HDU 4923 Room and Moor(推理+栈维护)
  • linux hosts.equiv设置解析
  • js脚本 将本地图片路径转换为html
  • Python3连接MySQL
  • FineBI学习系列之FineBI的Windows里安装步骤(图文详解)
  • 初次尝试单元测试
  • 突发奇想 应用商店的会员模式
  • Swift 基本数据类型
  • iterator取集合元素
  • 前端ps切图,图文教程,详细。
  • android6.0以上权限动态申请,有视频链接可以看效果。
  • 【刷算法】从上往下打印二叉树
  • create-react-app做的留言板
  • Java基本数据类型之Number
  • js操作时间(持续更新)
  • mongo索引构建
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • VUE es6技巧写法(持续更新中~~~)
  • vue2.0项目引入element-ui
  • 今年的LC3大会没了?
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #if #elif #endif
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (第二周)效能测试
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一) storm的集群安装与配置
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • 、写入Shellcode到注册表上线
  • .gitignore
  • .Net IOC框架入门之一 Unity
  • .NET Reactor简单使用教程
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net操作Excel出错解决
  • .net连接MySQL的方法
  • @Autowired自动装配
  • @RequestMapping-占位符映射
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • @Transactional 竟也能解决分布式事务?
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [android] 手机卫士黑名单功能(ListView优化)
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [C++] sqlite3_get_table 的使用
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)
  • [HackMyVM]靶场Boxing
  • [JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]