题意

这题目有一点问题,应该是在n个格子里有k个棋子,k是偶数.从左到右一白一黑间隔出现.有两个人不妨叫做小白和小黑.两个人轮流操作,每个人可以选 1~d 枚自己颜色的棋子,如果是白色则只能向右移动,如果是黑色只能向左移.移动过程中不能越过其他棋子.每个棋子的移动步数是任意的.不能操作的人就算输.求先手必胜的初始局面数模109+710^9+7109+7的值.

分析

我们把k2\frac k22k​每一对黑白棋之间的距离看作一堆石子,那么问题就转化为了有k2\frac k22k​堆石子,每次可以选1...d1...d1...d堆石子,每一堆随意取多少,没有石子取的算输.

我们把问题转换为总方案减去先手必败的方案.我们先考虑假设每一堆石子只有一个,那么必败状态是?没错,就是石子堆数%(d+1)=0的状态.因为先手不管拿1~d的多少,另一个人都可以拿若干石子使得两人拿的石子数加起来等于(d+1)

那么当每一堆石子不止一个时,把k2\frac k22k​堆石子的石子数用二进制表示,统计每位上的1的个数,若每位上1的个数%(d+1)全为0,则必败.

所以说我们就可以DP了.用f[i][j]f[i][j]f[i][j]表示在二进制中满足了前iii位的1的个数%(d+1)都为0,石子数为jjj的方案数.转移时只用枚举一下这一位上的1的个数是(d+1)的x倍就可以转移了.转移时乘上C(k2,x∗(d+1))C(\frac k2,x*(d+1))C(2k​,x∗(d+1)),表示在k2\frac k22k​堆石子中选哪些来放1.石子数确定了,但在格子上的位置还没有确定,最后还要乘上每个白棋放在哪里.

CODE

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
namespace READ {
inline void read(int &num) {
char ch; while((ch=getchar())<'0'||ch>'9');
for(num=0;ch>='0'&&ch<='9';num=num*10+ch-'0',ch=getchar());
}
}
using namespace READ;
typedef long long LL;
const int MAXN = 10005;
const int LOG = 15;
const int mod = 1e9+7;
int N, K, D;
LL f[LOG][MAXN], fac[MAXN], inv[MAXN];
inline void Pre() {
fac[0] = fac[1] = inv[0] = inv[1] = 1;
for(int i = 2; i <= N; ++i) inv[i] = 1ll * (mod - mod/i) * inv[mod%i] % mod;
for(int i = 2; i <= N; ++i) fac[i] = fac[i-1] * i % mod, inv[i] = inv[i-1] * inv[i] % mod;
}
inline LL C(int n, int m) {
if(m > n) return 0;
return fac[n] * inv[m] % mod * inv[n-m] % mod;
}
int main () {
read(N), read(K), read(D), Pre(); K>>=1;
f[0][0] = 1;
for(int i = 0, bit = 1; i < LOG-1; ++i, bit<<=1)
for(int j = 0; j <= N-(K<<1); ++j) if(f[i][j])
for(int x = 0; x*(D+1) <= K && j+x*(D+1)*bit <= N-(K<<1); ++x)
f[i+1][j+x*(D+1)*bit] = (f[i+1][j+x*(D+1)*bit] + f[i][j] * C(K, x*(D+1))) % mod;
LL ans = C(N, K<<1);
for(int i = 0; i <= N-(K<<1); ++i) ans = (ans - f[LOG-1][i] * C(N-K-i, K)) % mod;
printf("%lld\n", (ans + mod) % mod);
}

BZOJ 2281: [Sdoi2011]黑白棋 (Nim游戏+dp计数)的更多相关文章

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

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

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

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

  3. BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)

    怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...

  4. BZOJ 2281: [Sdoi2011]黑白棋(dp+博弈论)

    传送门 解题思路 首先发现可以把相邻的黑白棋子之间的距离看成一堆棋子,那么这个就可以抽象成\(Nim\)游戏每次可以取\(d\)堆这个游戏,而这个游戏的\(SG\)值为\(x\%(d+1)\),那么题 ...

  5. bzoj 2281: [Sdoi2011]黑白棋

    再次,,,,,虚(一开始看错题了,看成一次移动一个棋子,能移动1-d个格子...这样的话有没有大神会做??本蒟蒻就教) 额,,直接%%%%把...http://hzwer.com/5760.html ...

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

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

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

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

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

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

  9. P2490 [SDOI2011]黑白棋

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

随机推荐

  1. if("\v"=="v")来判断IE浏览器

    if(!+"\v1"){ IE代码}else{ 其他浏览器代码} if("\v"=="v"){//true为IE浏览器, document. ...

  2. 【转帖】史上最全PostgreSQL体系结构

    史上最全PostgreSQL体系结构 2019年07月16日 18:00:00 Enmotech 阅读数 35   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...

  3. WebElement的方法:

    这个类代表HTML页面元素 id_ #当前元素的ID tag_name #获取元素标签名的属性 text #获取该元素的文本. click() #单击(点击)元素 submit() #提交表单 cle ...

  4. Python【BeautifulSoup解析和提取网页数据】

    [解析数据] 使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译为我们能看懂的样子 在爬虫中,也要使用能读懂html的工具,才能提取到想要的数据 [提取数据]是指把我们需要的数据从众多数据中挑 ...

  5. (十一)web服务与javaweb结合(2)

    一.解决问题及解决方法 解决问题:上章节用监听器的方式是有缺陷的:web服务的端口和web工程的端口不能一致. 解决方案:将webService绑定到web工程中,使得共用一个端口. 二.案例 2.1 ...

  6. 【转载】使用appium遇到的坑

    问题 1. error: Failed to start an Appium session, err was: Error: Requested a new session but one was ...

  7. 用Altium Designer16 绘制STM32开发板PCB 笔记

    第一部分 Altium designer 软件概括 一.安装:要安装英文版,只安装pcb design和importers/exporters 二.设置:dxp-preferences我们关心的是sy ...

  8. JVM内存结构划分

    JVM内存结构划分 JVM内存结构划分 数据区域划分 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 StringTable 直接内存 创建新对象说明 对象的创建 对象的内存布局 对象头 ...

  9. JavaScript Drum kit

    用 JavaScript 实现网页鼓乐器,相关的初始代码在 JavaScript30 官网和 GitHub 上已经存在.我把 sound 文件夹下的音频全部替换掉了,一些相关解释也直接在注释中标明. ...

  10. babel-plugin-transform-remove-strict-mode

    场景:在VUE项目中,需要用到横向滚动条,在引入MUI相关的组件后,模板中的代码如下 在控制台中报错 报错内容说的是在严格模式下(strict mode)类型错误 经过推测,觉得可能是mui.js中用 ...