题面

题面

题解

观察题目,我们可以发现,这个游戏其实就是不断再把对方挤到一边去,也就是黑子不断往左走,白子不断往右走。

因此可以发现,如果将黑白子按顺序两两配对,那么它们中间的距离会不断缩小,且每次操作只能改变k对黑白子中间的距离,并且每次改变多少没有限制。

那么这就变成了一个kth-nim游戏,因此我们把匹配的黑白子中间的距离当做石子个数,直接按照kth-nim游戏来做即可.

输出方案则要用到DP。

f[i][j]表示DP到二进制的第i位,放j个石头的不合法方案。

那么根据nim游戏,为了保证不合法,我们就要保证二进制上的每一位的1的个数之和整除(k + 1)。

因此我们枚举现在一共已经用了多少个石子,然后枚举当前位(二进制第i位)要用到多少石子。

再用组合数来计算分配方案即可。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define p 1000000007
#define AC 20100
#define ac 20
#define LL long long LL n, k, d, ans;
LL fac[AC], inv[AC], f[ac][AC], bits[ac];//f[i][j]表示二进制前i位,放j个石子的方案数 LL C(int x, int y){return fac[x] * inv[y] % p * inv[x - y] % p;}
void up(LL &x, LL y)
{
x += y;
if(x < 0) x += p;
if(x >= p) x -= p;
} void pre()
{
scanf("%lld%lld%lld", &n, &k, &d);
inv[0] = inv[1] = fac[0] = bits[1] = 1, k >>= 1;//注意0!= 1
int tmp = n + k;
for(R i = 2; i <= tmp; i ++) inv[i] = (p - p / i) * inv[p % i] % p;
for(R i = 1; i <= tmp; i ++) //求出阶乘表和阶乘逆元表
fac[i] = fac[i - 1] * i % p, inv[i] = inv[i] * inv[i - 1] % p;
for(R i = 2; i <= 15; i ++) bits[i] = bits[i - 1] << 1;
} void work()
{
int maxn = 15, all = n - 2 * k;
f[0][0] = 1;
for(R i = 1; i <= maxn; i ++)
{
for(R j = 0; j <= all; j ++)//枚举当前格子数
{
for(R l = 0; l <= k; l += d + 1)//枚举d + 1的倍数(相比于上次的增量),因为当前位1的个数必须是d + 1的倍数
{//把这l份(d + 1)分配给每一堆石子,但不能拆开任意一堆(不然这个1就不在第i位了)
int have = j - l * bits[i];//上个格子的
if(have < 0) break;//且每堆要么分一个,要么不分,所以份数不能超过堆数
up(f[i][j], f[i - 1][have] * C(k, l) % p);//在k堆里面选l堆出来放
}
}
}//先枚举放了的石子个数,于是就要在剩下的n - i - 2 * k个格子中插入允许相邻的k堆石子 n - i - 2 * k + k = n - i - k
for(R i = 0; i <= all; i ++) up(ans, -C(n - i - k, k) * f[15][i] % p);
up(ans, C(n, k << 1));
printf("%lld\n", ans);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
//fclose(stdin);
return 0;
}

[SDOI2011]黑白棋 kth - nim游戏的更多相关文章

  1. Bzoj 2281 [Sdoi2011]黑白棋 题解

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

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

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

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

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

  4. P2490 [SDOI2011]黑白棋

    P2490 [SDOI2011]黑白棋 题意 一个 \(1*n\) 的棋盘上,A 可以移动白色棋子,B 可以移动黑色的棋子,其中白色不能往左,黑色不能往右.他们每次操作可以移动 1 到 \(d\) 个 ...

  5. BZOJ 2281: [Sdoi2011]黑白棋 (Nim游戏+dp计数)

    题意 这题目有一点问题,应该是在n个格子里有k个棋子,k是偶数.从左到右一白一黑间隔出现.有两个人不妨叫做小白和小黑.两个人轮流操作,每个人可以选 1~d 枚自己颜色的棋子,如果是白色则只能向右移动, ...

  6. BZOJ2281[Sdoi2011]黑白棋&BZOJ4550小奇的博弈——DP+nimk游戏

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

  7. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  8. 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋

    Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...

  9. [SDOI2011]黑白棋

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

随机推荐

  1. JQuery事件机制

    1 事件操作 1.1 页面载入事件 $(document).ready(function(){ // 在这里写你的代码... }); 或者 $(function($) { // 你可以在这里继续使用$ ...

  2. python编辑购物车

    一.需求分析 输入工资金额,进入购物车,并打印输出商品编号和价格,用户可以通过输入商品编号进行商品选购 余额不足时,打印提示信息 通过q进行退出结算 购物车能够循环购物 二.代码实现 ShoopCar ...

  3. 最短路径算法(I)

    弗洛伊德算法(Floyed-Warshall) 适用范围及时间复杂度 该算法的时间复杂度为O(N^3),适用于出现负边权的情况. 可以求取最短路径或判断路径是否连通.可用于求最小环,比较两点之间的大小 ...

  4. 用vsstudio 设计Winform 高分屏上布局错乱的问题

    在使用win10高分辨率150%,200%系统进行winform开发时, 会有布局错乱的现象,比如之前定义的300px的宽度,往往被设置成600px (200%分辨率下). 这个问题vs2015的解决 ...

  5. ES6对数组的扩展

    ECMAScript6对数组进行了扩展,为数组Array构造函数添加了from().of()等静态方法,也为数组实例添加了find().findIndex()等方法.下面一起来看一下这些方法的用法. ...

  6. 吴恩达机器学习笔记——正规方程(Normal Equation)

    问题描述:m examples : (x(1),y(1)), (x(2),y(2)),..., (x(m),y(m)) and n features; 计算方法:θ = (XTX)-1XTy; 计算过 ...

  7. 王者荣耀交流协会第6次Scrum立会

    Scrum master :刘耀泽 任思佳的导入excel原型博客地址:http://www.cnblogs.com/rensijia/p/7766812.html 王玉玲psp表格记录功能博客地址: ...

  8. 大学网站UI设计分析(以学校领导/历届领导为例)

    第一次的冲刺阶段让我过了一把PM的瘾,第一阶段的冲刺完成以后第一感觉就是PM不好当,在大学里做个课程设计当个PM相对而言还是比较容易的,但是我明白,当我们走向工作岗位以后,面临的情况会比学校的情况的复 ...

  9. python爬虫调用搜索引擎及图片爬取实战

    实战三-向搜索引擎提交搜索请求 关键点:利用搜索引擎提供的接口 百度的接口:wd="要搜索的内容" 360的接口:q="要搜索的内容" 所以我们只要把我们提交给 ...

  10. Alpha事后诸葛会议

    [设想和目标] Q1:我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? "小葵日记"是为了解决18-30岁年轻用户在记录生活时希望得到一美体验友好 ...