bzoj2281
有思维难度的好题
这种题我们一般可以先从部分分考虑
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的更多相关文章
- 【bzoj2281】 Sdoi2011—黑白棋
http://www.lydsy.com/JudgeOnline/problem.php?id=2281 (题目链接) 题意 一个1*n的棋盘,棋盘上一个隔一个的放着个黑棋和白棋,最左端是白棋,最右端 ...
- 【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)
[BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...
- 【BZOJ2281】【Sdoi2011】黑白棋 解题报告
[BZOJ2281][Sdoi2011]黑白棋 Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个\(1\)*\(n\)的棋盘上进行的,棋盘上有\(k\)个棋子,一半是 ...
- [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec Memory Limit: 512 MBSubmit: 626 Solved: 390[Submit][Status][ ...
- 【bzoj2281】[Sdoi2011]黑白棋
博弈论---Nimk问题. dp再搞搞. 很容易看出,该游戏的终态是每两个棋子都紧靠着.当一颗棋子移动,另一方与该棋子对应的那一刻可以立即追上,使得仍旧紧靠,最终棋子动弹不得,游戏结束. 还能看出,对 ...
- 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋
Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...
- bzoj2281 [Sdoi2011]黑白棋
一眼$nimk$游戏,后来觉得不对劲,看了黄学长博客发现真的不是$nimk$. 就当是$nimk$做吧,那么我们要保证每一位上一的个数都是$d+1$的倍数. $dp$:$f[i][j]$表示从低到高第 ...
- BZOJ2281[Sdoi2011]黑白棋&BZOJ4550小奇的博弈——DP+nimk游戏
题目描述 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色 ...
- BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)
Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...
随机推荐
- 【开发】Dialog 对话框
提示:Dialog 继承自 Panel,有大量的方法在 Panel 中已被定义,可以复用. Dialog API:http://www.jeasyui.net/plugins/181.html Pan ...
- 检测PC端和移动端的方法总结
正在苦逼的实习中,昨天公司让做一个页面,涉及到检测终端的问题,如果是手机设备,就跳转到指定的网页上,以前写响应式布局只要用@media screen来实现布局的差异化适应,但是现在不仅仅是布局,还要针 ...
- 08_XML的解析_SAX解析
[对比SAX解析和DOM解析] * 在使用DOM解析XMl文档时,需要读取整个XML文档,在内存中架构代表整个DOM树的DOcument对象,从而对XML文档进行操作,在这种情况下,如果XML文档特别 ...
- 关于atoi的实现
一.关于atoi atol的实现 __BEGIN_NAMESPACE_STD __extern_inline double __NTH (atof (__const char *__nptr)) { ...
- POJ 2127 Greatest Common Increasing Subsequence -- 动态规划
题目地址:http://poj.org/problem?id=2127 Description You are given two sequences of integer numbers. Writ ...
- Linux中的磁盘
Linux的磁盘管理 (很重要请注意高能预警) 硬盘:几个盘片,双面,磁性颗粒, 处理速率不同步:借助于一个中间层 文件系统(FileSystem) 可以实现对磁盘行的文件进行读写 文 ...
- hdu 5055 Bob and math problem
先把各个数字又大到小排列,如果没有前导零并且为奇数,则直接输出.如果有前导零,则输出-1.此外,如果尾数为偶数,则从后向前找到第一个奇数,并把其后面的数一次向前移动,并把该奇数放到尾部. 值得注意的是 ...
- C#方法解析
“方法”是包含一系列语句的代码块. 程序通过“调用”方法并指定所需的任何方法参数来执行语句. 在 C# 中,每个执行指令 都是在方法的上下文中执行的. 最近在写一个反射调用时,需要通过反射来调用方法. ...
- normalize.css介绍
Normalize.css 只是一个很小的CSS文件,但它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset,Normalize.css是一种现代的.为HTML5准备 ...
- JavaScript中的运算符种类及其规则介绍
JavaScript中的运算符有很多,主要分为算术运算符,等同全同运算符,比较运算符,字符串运算符,逻辑运算符,赋值运算符等.这些运算符都有一些属于自己的运算规则,下面就为大家介绍一下JavaScri ...