有思维难度的好题
这种题我们一般可以先从部分分考虑
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. ES6的promise的学习

    1.Promise的含义: Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Pro ...

  2. sea.js说明文档

    Sea.js 手册与文档 首页 | 索引 目录 模块定义 define id dependencies factory exports require require.async require.re ...

  3. wifidog编译到openwrt

    首先敲一下 cd 命令,定位到自己的用户目录, 然后 mkdir openwrt 新建一个openwrt文件夹,然后开始装openwrt的编译用到的工具, sudo apt-get install g ...

  4. 排序算法ONE:选择排序SelectSort

    /** *选择排序: * 对冒泡排序的一个改进 * 进行一趟排序时,不用每一次都交换,只需要把最大的标示记下 * 然后再进行一次交换 */ public class SelectSort { /** ...

  5. Cache的Add之委托解说

    正文 想了想还是写了吧,虽然知识含量比较低..... 获取数据放到缓存中,自己用Add添加的结果老是报参数错误,我擦咧,自己还总感觉是委托的问题.              call.Invoke(& ...

  6. Java应用程序可执行jar文件与服务器交互中文乱码

    生成可执行jar文件后,直接双击打开应用,发送Http请求带有中文时,服务器接收到的中文乱码! 解决方式: 1.在cmd命令中执行javaw命令打开jar可执行应用: 打开cmd命令框,输入: jav ...

  7. Silverlight之我见

    好长时间没搞Silverlight方面的开发了,原本都以为自己早已忘记,然而前阵子(确切一点说,是挺长时间以前了)的时候,发布Windows10的时候,微软宣布新的浏览器将重新开发,关键是后半句引起了 ...

  8. 【转】oracle 针对中文字段进行排序

    1)按笔画排序 select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_STROKE_M') 2)按部首排序 select ...

  9. JVM里面hashtable和hashmap实现原理

    JVM里面hashtable和hashmap实现原理   文章分类:Java编程 转载 在hashtable和hashmap是java里面常见的容器类, 是Java.uitl包下面的类, 那么Hash ...

  10. asp.net mvc get controller name and action name

    @{ var controller = @HttpContext.Current.Request.RequestContext.RouteData.Values["controller&qu ...