【BZOJ4550】小奇的博弈 博弈论
【BZOJ4550】小奇的博弈
Description
.png)
Input
Output
Sample Input
Sample Output
题解:首先思考K=2的情况,显然白棋可以直接往右移到黑棋左边,然后黑棋只能被动往右移,然后白棋又可以不断向右将黑棋逼死,所以如果一开始中间的间隔不为0则先手必胜,反之先手必输。
K>2的情况同理,白棋是一定不会主动往左移的,黑棋也一定不会主动往右移,所以黑白之间的间隔一定会不断变小,这变成了什么?我们将间隔视为石子,那么这就相当于k堆石子,没人可以从1-d堆中取出若干个石子。这是一个经典的Nimk问题。结论:我们将石子数二进制拆分,对所有石子的每一位都进行不进位的加法,先手必输当且仅当每一位的和%(d+1)都=0,否则先手必胜。
显然是先手必输的情况比较好处理。然后DP。我们用f[i][j]表示统计到二进制的前i位,已经用了j枚石子,先手必输的情况数。转移时用组合数搞一搞即可。总方案数显然是$ C_n^k $。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll P=1000000007;
int n,k,d;
ll ans;
ll f[20][10010],c[10010][110];
int main()
{
scanf("%d%d%d",&n,&k,&d);
int i,j,l;
for(i=0;i<=n;i++)
{
c[i][0]=1;
for(j=1;j<=i&&j<=k;j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%P;
}
f[0][0]=1;
for(i=0;i<16;i++) for(j=0;j<=n-k;j++) for(l=0;(1ll<<i)*(d+1)*l<=j&&(d+1)*l<=k/2;l++)
{
f[i+1][j]=(f[i+1][j]+f[i][j-(1ll<<i)*l*(d+1)]*c[k/2][(d+1)*l])%P;
}
for(i=0;i<=n-k;i++) ans=(ans+f[16][i]*c[n-i-k/2][k/2])%P;
printf("%lld",(c[n][k]-ans+P)%P);
return 0;
}
【BZOJ4550】小奇的博弈 博弈论的更多相关文章
- BZOJ4550: 小奇的博弈(NIMK博弈& 组合数& DP)
4550: 小奇的博弈 Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 159 Solved: 104[Submit][Status][Discuss] ...
- 【bzoj4550】小奇的博弈 博弈论+dp
题目描述 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色.最左边是白色棋子,最右边 是黑色棋子,相邻的棋子颜色不同. 小奇可以移动白色棋子,提比可以移动黑色的棋子, ...
- BZOJ4550 小奇的博弈 【Nimk游戏 + dp + 组合数】
题目 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色.最左边是白色棋子,最右边 是黑色棋子,相邻的棋子颜色不同. 小奇可以移动白色棋子,提比可以移动黑色的棋子,它们每次 ...
- BZOJ2281[Sdoi2011]黑白棋&BZOJ4550小奇的博弈——DP+nimk游戏
题目描述 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色 ...
- bzoj4550 小奇的博弈
我看出了是个 Nimk 问题.... dp我明白意思,我也会推组合数.... 但是...神tm统计答案啊...蒟蒻不会~
- bzoj 4550: 小奇的博弈【博弈论+dp】
首先看出终止状态是全都堆在左边或者右边,然后发现黑的向左白的向右是最优策略(如果不能这样了也就该输了) 然后就不会了 参考 http://www.cnblogs.com/CQzhangyu/p/770 ...
- 牛客网某比赛 I 小乐乐学博弈 博弈论
题目大意: 有两堆石子\(n\)和\(m\),每次可以拿\(1 \sim k\)个 \(k >= |n - m|\) 问先手必胜? 把限制条件去掉才有意思 首先考虑两堆相等,那么先手怎么操作,后 ...
- 【BZOJ-4548&3658】小奇的糖果&Jabberwocky 双向链表 + 树状数组
4548: 小奇的糖果 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 103 Solved: 47[Submit][Status][Discuss] ...
- 【BZOJ-4547】小奇的集合 矩阵乘法 + 递推
4547: Hdu5171 小奇的集合 Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 175 Solved: 85[Submit][Status][D ...
随机推荐
- oracle 事务多表查询以及额外的用处
/* 以下代码是对emp表进行显示宽度设置*/ col empno for 9999;col ename for a10;col job for a10;col mgr for 9999;col hi ...
- linux 常用的命令(转)
常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir ...
- word2016打开2007文档出错
不知从何时起,我电脑上的一部分office文件打开时频频报错!!! 有一段时间发现,通过iis发布的网站上下载excel文件的时候,通过localhost下载的文件能够正常打开,但是通过IP和端口下载 ...
- PHP保留2位小数、格式化小数、浮点数
JS保留两位小数例子 四舍五入使用函数 toFixed() [javascript] <html> <head> </head> <script> va ...
- rownum使用说明
参考:http://www.blogjava.net/conans/articles/219693.html 参考:http://www.blogjava.net/freeman1984/archiv ...
- 有关linux磁盘分区优化
Linux中几个重要的目录,这几个目录在ubuntu安装的硬盘分区时,可选择性的特别分区,进行挂载./usr 文件系统中一般不改变的文件,如库,程序./var 文件系统包含会改变的文件./home 文 ...
- xgboost 安装
git clone --recursive https://github.com/dmlc/xgboostcd xgboost/make -j4 cd python-package/ python s ...
- c# 文件操作 txt、xml、ini
1. txt文件 /// <summary> /// 读文本文件信息 /// </summary> /// <param name="FilePath" ...
- 怎样用Google APIs和Google的应用系统进行集成(5)----怎样把Google Tasks的JSON Schema转换成XML的Schema(XSD)?
前面说了一些Google API的介绍,可是在实际的开发其中,我们可能须要把Google RESTful API返回的JSON数据转换成XML数据输入到第三方系统,这在企业应用集成里面很的常见. 那么 ...
- visitor设计模式记录
数据类型通过枚举来区分是一种简单实用的做法. 缺点是使用的时候需要通过if .switch 去判断什么类型执行什么分支操作,说是缺点其实也要看具体场景.不过如果if代码多会导致代码很长是肯定的. 复杂 ...