【BZOJ4550】小奇的博弈 博弈论
【BZOJ4550】小奇的博弈
Description
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 ...
随机推荐
- linux安装php sphinx出错
安装sphinx的php客户端 # wget -c http://pecl.php.net/get/sphinx-1.3.0.tgz # .tgz # cd sphinx- # phpize # ./ ...
- oc 阿拉伯数字转中文数字
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; formatter.numberStyle = NSNumberFor ...
- 【HTML+CSS】(2)CSS Sprite雪碧图
1. 雪碧图的使用场景 (1). 静态图片.不随用户信息的变化而变化 (2). 小图片.图片容量比較小 (3). 载入量比較大 一些大图不建议拼成雪碧图,比如淘宝站点的导航图片都是使用的雪碧图. 2. ...
- Hibernate关联关系(二) Cascade级联
1.cascade定义的是关系两端对象到对象的级联关系:而inverse定义的是关系和对象的级联关系. all : 所有情况下均进行关联操作. none:所有情况下均不进行关联操作.这是默认值. ...
- Powershell - 获取OS版本信息和catpion信息
Environment 获取 OSversion: $OSVersion = [System.Environment]::OSVersion.Version WMI获取Caption: $OSCap ...
- laydate 和 Vue 奇怪的清空问题
laydate的input,会自动被清空,当别的input修改的时候.改成这样既可解决 <td><input type="text" id="retur ...
- Linux中history历史命令使用方法详解
当你在玩Linux的时候,如果你经常使用命令行来控制你的Linux系统,那么有效地使用命令历史机制将会使效率获得极大提升.事实上,一旦你掌 握了我在下面给出的15个有关Linux history历史命 ...
- Bash中的空格
空格,一个看不见的字符,很不起眼,很多人经常忽略它,导致代码出错,却还找不着北. 先了解下bash中什么时候该用空格,什么时候不该用. . 等号赋值两边不能有空格 . 命令与选项之间需要空格 . 管道 ...
- Nginx日志深入详解
一.日志分类 Nginx日志主要分为两种:访问日志和错误日志.日志开关在Nginx配置文件(/etc/nginx/nginx.conf)中设置,两种日志都可以选择性关闭,默认都是打开的.1.访问日志 ...
- poj2392 Space Elevator(多重背包问题)
Space Elevator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8569 Accepted: 4052 ...