有思维难度的好题
这种题我们一般可以先从部分分考虑
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. Linux Terminal命令

    Linux Terminal命令 1.Ctrl + a 回到命令行の「行首/head」. 2.Ctrl + e 回到命令行の「行尾/tail」, ctrl + end. 3.Ctrl + w 後向/b ...

  2. WTL 中CComboBoxEx显示不了的问题

    在使用WTL的CComboBoxEx时,InsertItem之后,运行程序,ComboBox显不了问题,其原因如下: I guess you want to place combo box to di ...

  3. Cabarc Overview (Microsoft TechNet)

    Original Link:  Cabarc Overview Applies To: Windows Server 2003, Windows Server 2003 R2, Windows Ser ...

  4. Apache(二)

    Apache的基本配置 1.监听套接字[ip : port] 2.实现持久连接(keep alive) 3.MPM模块 命令行中执行 core.c        :  核心模块 prefork.c   ...

  5. python计算两个日期时间差

    经常在python中因为日期而google,在此做个小笔记. >>>import datetime >>> a = datetime.date.today() &g ...

  6. MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传

    本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件 ...

  7. div重叠不变形

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. jquery点击其他地方隐藏div层的实现程序

    js代码 $(document).ready(function() { //语言头部的点击事件,显示语言列表 $(".language_selected").click(funct ...

  9. Android分类前言

    柚子园项目搁置后,半年多时间里都在开发微信公众平台和在公司实习,用的都是python,django,bottle,已经很久没有开发android了.技术的东西,不用就容易生疏甚至忘掉.刚好现在需要写毕 ...

  10. 成为Java GC专家(4)—Apache的MaxClients参数详解及其在Tomcat执行FullGC时的影响

    下面我们看一下Apache的 MaxClients 参数在Full GC 发生时是如何影响系统的. 大部分开发人员都知道在由于GC发生而导致的”停止世界现象(STW) “(详细请参见Understan ...