【BZOJ2281】【Sdoi2011】黑白棋

Description

​ 小A和小B又想到了一个新的游戏。

​ 这个游戏是在一个\(1\)*\(n\)的棋盘上进行的,棋盘上有\(k\)个棋子,一半是黑色,一半是白色。

​ 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同。

​ 小A可以移动白色棋子,小B可以移动黑色的棋子,他们每次操作可以移动\(1\)到\(d\)个棋子。

​ 每当移动某一个棋子时,这个棋子不能跨越两边的棋子,当然也不可以出界。当谁不可以操作时,谁就失败了。

​ 小A和小B轮流操作,现在小A先移动,有多少种初始棋子的布局会使他胜利呢?

​ 先手不能左移,后手不能右移

Input

​ 共一行,三个数,\(n,k,d\)。

Output

​ 输出小A胜利的方案总数。答案对\(1000000007\)取模。

HINT

\(1<=d<=k<=n<=10000\), \(k\)为偶数,\(k<=100\)。


越发的觉得自己是个低能儿了...

注意原题是没有“先手不能左移,后手不能右移”这个条件的,不过被黄学长hack了,于是部分oj加上了

然后发现先手有个必败局面是所有对应的黑白棋相邻。

然后我们发现移动会造成对应的相邻黑白棋的距离缩小

于是可以发现是个\(k-nim\)游戏

关于这个东西有个结论,若子游戏\(SG\)每一位的\(1\)的总个数都可以被\((d+1)\)整除,当前局面是必败局面。

然后问题转换成,在序列上选取若干个不相交区间,保证区间的长度满足一些要求。

因为要求是按位的,所以做数位\(dp\)

\(dp_{i,j}\)代表前\(i\)位满足条件且选取的区间总长度是\(j\)的方案数。

\(dp_{0,0}=1\)是初始状态,表示区间长度为\(0\)

然后推出去会比较好些,我们先不讨论每个区间的位置,只讨论区间的长度的方案。

于是有\(dp_{i,j+len*x*(d+1)}+=dp_{i,j}*\binom{k/2}{x(d+1)}\)

\(len\)当前位数对应的长度,\(x\)枚举是几倍,然后组合数选那几个区间

最后确定位置每个状态乘上\(\binom{n-j-k/2}{k/2}\)就可以了


Code:

#include <cstdio>
#define ll long long
const ll mod=1e9+7;
const int N=1e4+10;
ll inv[N<<3],fac[N<<3],dp[16][N];
ll qp(ll d,ll k)
{
ll f=1;
while(k)
{
if(k&1) f=f*d%mod;
d=d*d%mod;
k>>=1;
}
return f;
}
ll C(int m,int n)
{
if(n<0||m<n) return 0;
return fac[m]*inv[m-n]%mod*inv[n]%mod;
}
int main()
{
int n,k,d;
scanf("%d%d%d",&n,&k,&d);
fac[0]=1;int le=1<<15;
for(int i=1;i<=le;i++) fac[i]=fac[i-1]*i%mod;
inv[le]=qp(fac[le],mod-2);
for(int i=le-1;~i;i--) inv[i]=inv[i+1]*(i+1)%mod;
dp[0][0]=1;
for(int i=0;i<=14;i++)
{
int len=1<<i;
for(int x=0;x*len*(d+1)<=n;x++)
for(int j=0;j+x*len*(d+1)<=n;j++)
(dp[i+1][j+x*len*(d+1)]+=dp[i][j]*C(k/2,x*(d+1)))%=mod;
}
ll ans=0;
for(int i=0;i<=n;i++) (ans+=dp[15][i]*C(n-i-k/2,k/2))%=mod;
printf("%lld\n",(C(n,k)-ans+mod)%mod);
return 0;
}

2018.12.18

【BZOJ2281】【Sdoi2011】黑白棋 解题报告的更多相关文章

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

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

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

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

  3. bzoj2281 [Sdoi2011]黑白棋

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

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

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

  5. BZOJ2281 [SDOI2011]黑白棋 【dp + 组合数】

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

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

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

  7. Bzoj 2281 [Sdoi2011]黑白棋 题解

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

  8. P2490 [SDOI2011]黑白棋

    P2490 [SDOI2011]黑白棋 题意 一个 \(1*n\) 的棋盘上,A 可以移动白色棋子,B 可以移动黑色的棋子,其中白色不能往左,黑色不能往右.他们每次操作可以移动 1 到 \(d\) 个 ...

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

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

随机推荐

  1. 环境变量的配置-java-JMETER - 【Linux】

    rz上传 lz下载 步骤: . Linux下首先安装Jdk: . 下载apache-jmeter-4.0.tgz,复制到Linux系统中的/opt目录下: . 解压apache-jmeter-4.0. ...

  2. 利用jsencrypt 做非对称加密

    1.生成 private key openssl genrsa -out rsa_1024_priv.pem 1024 2.生成public key openssl rsa -pubout -in r ...

  3. js 的filter()方法

    filter()方法使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组. filter()基本语法: arr.filter(callback[, thisArg]) filter() ...

  4. 记事本APP之Alpha报告

    项目名称 记事本APP 项目版本 Alpha版本 负责人 北京航空航天大学计算机学院 Echo软件团队 联系方式 http://www.cnblogs.com/echo-buaa/ 要求发布日期 20 ...

  5. Daily Scrum (2015/10/24)

    由于这一天是周六,大家的学习热情依旧不是很高,但是在PM的要求和督促下,我们还是进行了一些工作.我们预计在明天(周日)完成全部的代码阅读工作,在下一周开始进行代码的编写工作,以下是我们的今日的工作情况 ...

  6. YQCB冲刺周第六天

    站立会议如上图 任务看板: 今天的任务为依旧为将用户记录的数据添加到数据库中,以及金额球的设置. 遇到的问题为金额球在jsp页面的显示.

  7. youi软件测试计划

    beta版本中,我们将重视软件开发中的测试. 我们的软件是需要测试的,不测试怎么知道好与不好呢?有的程序不测试甚至都不能运行-- 我们的目标呢:就是经过测试之后软件的质量得到有效的保证.不管什么情况都 ...

  8. 寒假作业第二篇随笔(A+B)

    Github链接:https://github.com/heihuifei/object-oriented A+B Format (20) Calculate a + b and output the ...

  9. Cosplay之孩子的妈咪

    很荣幸的担任“孩子妈妈”的角色,站在父母的角度去思考怎样的一个四则运算的APP才算是符合要求,可以受到广大家长的喜爱.不外乎有这样一些功能:1.可以随时的给孩子出题目,而且可以很快的得出正确答案.分析 ...

  10. js 对象的合并(3种方法)转载

    对象的合并 需求:设有对象 o1 ,o2,需要得到对象 o3 var o1 = { a:'a' }, o2 = { b:'b' }; // 则 var o3 = { a:'a', b:'b' } 方法 ...