题目描述

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

输入

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

输出

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

样例输入

10 4 2

样例输出

182

提示

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

感觉这道题有些问题,如果不限制白棋只能往右移、黑棋只能往左移,那么这道题就不能转化成nim游戏。

这里按照修改后的题目讲解。

可以发现最后的局面一定是第i个白棋和第i个黑棋紧挨着,那么问题就可以转化成初始时将第i个白旗和第i个黑棋间的空位数看成一堆石子,每人每次可以在最多k堆中的每堆取走任意多个石子,不能操作的人输。这个博弈和nim游戏很像叫做nimk游戏,可以看作是nim游戏的一个扩展。它同样有一个结论:对于nimk游戏,将每堆石子数用二进制表示,对于二进制的每一位如果这一位是1的石子堆数mod(d+1)都等于0,那么先手必败。证明和nim游戏的证明类似,可以参见博弈论讲解

那么我们可以用DP求出先手必败的方案数然后用总方案数减一下即可。f[i][j]表示所有堆石子二进制的前i位,放了j个石子的方案数。

先手必败方案数为,总方案数为

#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll f[30][100010];
ll g[10010][110];
int n,m,d;
const int mod=1000000007;
void C()
{
for(int i=0;i<=n;i++)
{
g[i][0]=1ll;
for(int j=1;j<=min(m,i);j++)
{
g[i][j]=(g[i-1][j]+g[i-1][j-1])%mod;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&d);
C();
f[0][0]=1;
for(int i=0;i<15;i++)
{
for(int j=0;j<=n-m;j++)
{
for(int k=0;k*(d+1)<=m/2&&j+k*(d+1)*(1<<i)<=n-m;k++)
{
f[i+1][j+k*(d+1)*(1<<i)]=(f[i+1][j+k*(d+1)*(1<<i)]+f[i][j]*g[m/2][k*(d+1)])%mod;
}
}
}
ll ans=0;
for(int i=0;i<=n-m;i++)
{
ans=(ans+f[15][i]*g[n-m/2-i][m/2])%mod;
}
printf("%lld",((g[n][m]-ans)%mod+mod)%mod);
}

BZOJ2281[Sdoi2011]黑白棋&BZOJ4550小奇的博弈——DP+nimk游戏的更多相关文章

  1. BZOJ4550 小奇的博弈 【Nimk游戏 + dp + 组合数】

    题目 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色.最左边是白色棋子,最右边 是黑色棋子,相邻的棋子颜色不同. 小奇可以移动白色棋子,提比可以移动黑色的棋子,它们每次 ...

  2. BZOJ4550: 小奇的博弈(NIMK博弈& 组合数& DP)

    4550: 小奇的博弈 Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 159  Solved: 104[Submit][Status][Discuss] ...

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

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

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

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

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

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

  6. bzoj2281 [Sdoi2011]黑白棋

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

  7. bzoj4550 小奇的博弈

    我看出了是个 Nimk 问题.... dp我明白意思,我也会推组合数.... 但是...神tm统计答案啊...蒟蒻不会~

  8. 【BZOJ4550】小奇的博弈 博弈论

    [BZOJ4550]小奇的博弈 Description 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色.最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同.   小 ...

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

    [BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...

随机推荐

  1. Spring MVC数据绑定入门总结

    1.基本类型 基本类型参数不可为空 正例:http://localhost:8080/demo/he?id=2 反例:http://localhost:8080/demo/he?id=(报400错误) ...

  2. 性能调优7:多表连接 - join

    在产品环境中,往往存在着大量的表连接情景,不管是inner join.outer join.cross join和full join(逻辑连接符号),在内部都会转化为物理连接(Physical Joi ...

  3. Java 多线程(六)之Java内存模型

    目录 1. 并发编程的两个问题 2 CPU 缓存模型 2.1 CPU 和 主存 2.2 CPU Cache 2.3 CPU如何通过 Cache 与 主内存交互 2.4 CPU 缓存一致性问题 3 Ja ...

  4. python之socket模块详解--小白博客

    主要是创建一个服务端,在创建服务端的时候,主要步骤如下:创建socket对象socket——>绑定IP地址和端口bind——>监听listen——>得到请求accept——>接 ...

  5. amd,cmd规范

    AMD 和 CMD 的区别有哪些? AMD规范与CMD规范的区别 回顾:前端模块化和AMD.CMD规范(全) 浅析JS模块规范:AMD,CMD,CommonJS 理解AMD ,CMD,CommonJS ...

  6. hibernate设置二级缓存时报错java.lang.NoClassDefFoundError: org/hibernate/engine/jndi/JndiNameException

    错误提示大概意思是,没有类定义错误,就是找不到要使用的hibernate二级缓存管理引擎类.我在这用的是ehcache二级轻量级缓存,报错原因可能是导入的jar包版本和使用的hibernate框架核心 ...

  7. PS调出水彩画效果古装人物照片

    首先在PS里操作: 1.磨皮液化 磨皮液化就不细说啦~常规操作. 2.背景调色 分析:想塑造油画般的感觉,背景颜色想要蓝绿色 1.用可选颜色工具里面的中性色改变整体颜色,把皮肤和头发颜色用蒙版擦出来: ...

  8. JavaScript中变量、执行环境、作用域与C#中的异同

    首先需要明确一个执行环境的概念,执行环境这个概念是用来理解作用域的,在js中,执行环境分为全局执行环境和局部(function)执行环境,而在C#这类的C类语言中,还有一个块级别的执行环境,如if语句 ...

  9. cmake : undefined reference to dlopen, dlclose, dlsym and dlerror

    链接出了问题 添加头文件 #include <dlfcn.h> 添加库 target_link_libraries(PROJECT_NAME ${CMAKE_DL_LIBS})

  10. MySQL5.5 安装配置方法教程

    MySQL下载地址:http://dev.mysql.com/downloads/installer/ 1.首先进入的是安装引导界面 2.然后进入的是类型选择界面,这里有3个类型:Typical(典型 ...