有思维难度的好题
这种题我们一般可以先从部分分考虑
30%的分数k=2也就是黑白各一个
不难发现如果初始黑白棋子相邻那必然是先手必败态否则一定是先手必胜
那么30分的部分分是很容易拿到的,组合数学
如果有多个棋子,必败态又是什么呢
由于黑白棋是相间隔的,我们不妨依次编号1号白棋,1号黑棋……一直编到k/2,我们记作m
同号棋子都相邻则一定是必败态,这个很容易看出来,还有呢?
我们假设编号为i的黑白棋之间有d[i]个格子
我们知道白棋往左移是没有意义的,因为黑棋也可以按同样的方向移同样多的格子
这样同号棋子间的间隔不变,本质还是刚才的状态,同理,黑棋往右移也是没有意义的
现在也就是每人轮流可以把d个白棋(黑棋)往右(左)移若干个格子
若是最后移动成同号棋子都相邻的那个人获胜
也就是,一共有m堆石子,每个人可以从最多d堆取任意多个,最后取完的获胜!
这不就是nim取石子的扩展吗?
考虑经典的nim取石子问题,在任意一堆中取任意个
若n堆石子的异或和=0则为先手必败
n堆石子异或和=0即二进制每一位异或和为0,也就是每一位和mod 2=0
于是我们脑洞大开的猜想,如果可以在1~d堆中任意取,
那先手必败态是否是每一位和mod (d+1)=0?
怎么证?其实很简单,首先全是0必然必败不多说
由于是可以取任意多个,所以二进制位之间互不影响
如果存在某位和x是(d+1)的倍数且不为0,那么先手操作最多只能对x-(0~d)因为最多操作d堆
那么下面,我仍然可以把x还原成(d+1)的倍数
所以很明显每一位和都mod (d+1)=0是先手必败态,否则为必胜
下面就是统计,我们显然可以用补集的思想,统计先手必败的数目
显然∑d[i]也就是m堆石子总和是在[0,n-k]之间
我们设f[i,j]表示到二进制第i位石子堆和为j的方案数,然后穷举这位和是(d+1)的倍数的情况
然后组合数学搞一搞,由于组合涉及到除法取模,所以我们还要求一下乘法逆元

 const mo=;
var f:array[-..,..] of int64;
a,b:array[..] of int64;
d,t,n,k,m,i,j,p,q:longint;
ans:int64; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function quick(y:int64;n:longint):int64;
begin
quick:=;
while n> do
begin
if n mod = then quick:=quick*y mod mo;
n:=n shr ;
y:=y*y mod mo;
end;
end; function c(n,m:longint):int64;
begin
exit(a[n]*b[m] mod mo*b[n-m] mod mo);
end; begin
readln(n,k,d);
m:=k div ;
a[]:=;
for i:= to n do
a[i]:=a[i-]*int64(i) mod mo;
b[]:=;
for i:= to n do
b[i]:=quick(a[i],mo-); //a^(p-)≡ (mod p) 明显a的乘法逆元即a^(p-)
f[-,]:=;
t:=trunc(ln(n)/ln());
for i:= to t do
for p:= to min(n-k,m*( shl i-)) do
for j:= to min(m div (d+),(n-k-p) div ( shl i) div (d+)) do
begin
q:=p+j*(d+)* shl i;
f[i,q]:=(f[i,q]+f[i-,p]*c(m,j*(d+)) mod mo) mod mo;
end; for i:= to n-k do
ans:=(ans+f[t,i]*c(n-i-k+m,m) mod mo) mod mo;//剩下的格子在邻号棋子之间放置
writeln((c(n,k)-ans+mo) mod mo);
end.

bzoj2281的更多相关文章

  1. 【bzoj2281】 Sdoi2011—黑白棋

    http://www.lydsy.com/JudgeOnline/problem.php?id=2281 (题目链接) 题意 一个1*n的棋盘,棋盘上一个隔一个的放着个黑棋和白棋,最左端是白棋,最右端 ...

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

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

  3. 【BZOJ2281】【Sdoi2011】黑白棋 解题报告

    [BZOJ2281][Sdoi2011]黑白棋 Description ​ 小A和小B又想到了一个新的游戏. ​ 这个游戏是在一个\(1\)*\(n\)的棋盘上进行的,棋盘上有\(k\)个棋子,一半是 ...

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

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

  5. 【bzoj2281】[Sdoi2011]黑白棋

    博弈论---Nimk问题. dp再搞搞. 很容易看出,该游戏的终态是每两个棋子都紧靠着.当一颗棋子移动,另一方与该棋子对应的那一刻可以立即追上,使得仍旧紧靠,最终棋子动弹不得,游戏结束. 还能看出,对 ...

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

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

  7. bzoj2281 [Sdoi2011]黑白棋

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

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

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

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

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

随机推荐

  1. javascript form验证、完善 第24节

    <html> <head> <title>Form对象</title> <style type="text/css"> ...

  2. WPF FileFolderDialog 和弹出子窗口的一些问题

    摘要:本文主要是WPF中 FileFolderDialog的相关问题,补充了关于在父窗口弹出子窗口,以及子窗口的相关属性(Data Binding)和命令绑定(Delegate Command)问题, ...

  3. OpenJudge/Poj 2105 IP Address

    1.链接地址: http://poj.org/problem?id=2105 http://bailian.openjudge.cn/practice/2105 2.题目: IP Address Ti ...

  4. html5新增标签兼容性

    很多低版本的浏览器是不识html5新增的标签的,所以为了解决浏览器兼容性问题,主要有两种方法: js可以创建我们自定义的标签,例如,我们可以用js语句 document.createElement(' ...

  5. ssh自动登录的4种实现方法

    ssh自动登录的几种实现方法,记录在此.  1. 自动ssh/scp方法 A为本地主机(即用于控制其他主机的机器) ; B为远程主机(即被控制的机器Server), 假如ip为192.168.60.1 ...

  6. PHP学习心得(八)——运算符

    运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西.所以可以认为函数或任何会返回一个值(例如 print)的结构是运算符,而那些没有返回值的( ...

  7. Oracle的rowid结构解析

    SQL> select rowid,deptno from dept; ROWID                  DEPTNO ------------------ ---------- A ...

  8. java三种工厂模式

    适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...

  9. Python属性、方法和类管理系列之----属性初探

    在学习dict的时候,肯定听过dict是Python中最重要的数据类型,但是不一定知道为什么.马上你就会明白原因了. Python中从模块.到函数.到类.到元类,其实主要管理方法就是靠一个一个的字典. ...

  10. 【深度学习系列3】 Mariana CNN并行框架与图像识别

    [深度学习系列3] Mariana CNN并行框架与图像识别 本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框 ...