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个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...
随机推荐
- 《C和指针》
<C和指针> static global varibale VS global variable static function VS normal function 数组变量 VS 字符 ...
- How to: Signing Installers You Create with Inno Setup
Original Link: http://revolution.screenstepslive.com/s/revolution/m/10695/l/95041-signing-installers ...
- 6.5 k个已排好序链表合并为一个排序链表
1 建立链表(带哨兵位的)2 建立最小堆方法3 合并已排好序的k个链表 typedef int DataType; //建立链表 class Link { private: struct Node { ...
- win/linux 下使用 psutil 获取进程 CPU / memory / IO 占用信息
psutil - A cross-platform process and system utilities module for Python 1. 安装 pip 安装即可. windows 下需要 ...
- hdu 5055 Bob and math problem
先把各个数字又大到小排列,如果没有前导零并且为奇数,则直接输出.如果有前导零,则输出-1.此外,如果尾数为偶数,则从后向前找到第一个奇数,并把其后面的数一次向前移动,并把该奇数放到尾部. 值得注意的是 ...
- leetcode problem 41 -- First Missing Positive
Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...
- PHOTOSHOP 半透明方格
1.新建60*60的透明文档,在左方和上方用直线工具画白边,存储为图案(编辑/定义图案) 2.新建图层,用油漆桶填充图案 3. 选择若干小方格,填充白色后设置不透明度50%
- C# 解析带前缀的Xml节点内容
一般的xml文件相信大家都会解析了,但是遇到有命名空间的带前缀的xml,对于新手可能会有点问题.我这里在论坛解答的时候就遇到过一题,见怎么获取XML节点里面的内容,在线求教.这里给大家演示一下. 他的 ...
- VS2010开发环境最佳字体及配色方法
Fixedsys Excelsior 3.01 1. 首先下载字体:http://www.fixedsysexcelsior.com/ 脚本之家字体下载 2. 安装字体:control panel ...
- Python设计模式——单例模式
单例模式是日常应用中最广泛的模式了,其目的就是令到单个进程中只存在一个类的实例,从而可以实现数据的共享,节省系统开销,防止io阻塞等等 但是在多进程的应用中,单例模式就实现不了了,例如一些web应用, ...