【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. 高可用OpenStack(Queen版)集群-16.Nova集成Ceph

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  2. 如何通过阿里云APP进行域名备案?阿里云备案流程需要多久?

    如何通过阿里云APP进行域名备案? 1.准备备案材料(很多初次使用阿里云APP进行备案的同学会问备案需要准备哪些资料,不二版本下面就给大家一一列举出来) 个人备案需要材料: ⑴<用户网站备案授权 ...

  3. Docker部署Golang

    1. 安装docker 2. mkdir myDocker 3.  cd myDocker && touch Dockerfile 4.  Dockerfile写入 # 将golang ...

  4. jenkins设置定时任务

    每次都手动的构建项目显然不够方便,有时候需要定时地执行自动化测试脚本.例如,每天晚上定时执行 pjenkins.py 文件来运行自动化测试项目. 设置定时任务 前面已经创建的 “python test ...

  5. 最新的CocoaPods 安装及使用

    当在开发iOS应用时,会经常使用到很多的第三方开源类库,一般的方法是直接从GitHub下载,然后拖到项目中使用,如果该开源类库不依赖其他的类库,就可以直接使用:如果该开源类库还依赖一些其他的类库,则需 ...

  6. 使用sass与compass合并雪碧图(一)

    雪碧图就是很多张小图片合并成一张大图片,以减少HTTP请求,从而提升加载速度.有很多软件可以合并雪碧图,但通常不太容易维护,使用compass生成雪碧图应该算是非常方便的方法了,可以轻松的生成雪碧图, ...

  7. 以符合人类阅读的方式打印php数组【转载】

    在程序开发过程中:打印数据进行查看调试是非常频繁的:如果没有一种易于阅读的样式那是相当痛苦的: 先定义一个数组: 1 2 3 4 5 6 7 8 9 $array=array(     't0'=&g ...

  8. ahk打印成pdf记录

    软工课程后记: 要求将博客打印成pdf存档.为了偷懒,不想自己点鼠标一个个保存,所以写了一个ahk小程序.博客教程推荐,建议一试,不难.还很方便.我也只学了点点皮毛,满足需求即止. 第一个成功的小例子 ...

  9. 互评beta版本 - 探路者【贪吃蛇】

    基于NABCD评论,及改进建议 1)N(Need 需求) 开发本软件一方面是为了让80,90后用户重温童年的美好记忆,另一方面也是为了增加对英语学习兴趣较弱.意志力薄弱的中小学生学习英语的兴趣和动力, ...

  10. js格式化json字符串和json对象

    1,格式化json对象 var json = {"@odata.context":"$metadata#AddTableOne_466281s","v ...