【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. Python遗传算法工具箱DEAP框架分析

    本文主要介绍python遗传算法工具箱DEAP的实现.先介绍deap的如何使用,再深入介绍deap的框架实现,以及遗传算法的各种实现算法. 代码可以参考 https://github.com/suma ...

  2. linux go环境安装

    方法一 这次将源码包安装的目录是是/root下. 1.官网下载源码包. 官网链接:https://golang.org/dl/   wget https://storage.googleapis.co ...

  3. 我眼中的PD(产品狗)

    以下内容可能引起您的不适(前方高能),请先移步科普: 产品经理为什么会存在? 本猿 -> web程序属 -> 前端开发种,从大森林迁徙到了小草原: 小草原物种稀缺,除了 程序猿,很难见到诸 ...

  4. centos 切换用户显示bash-4.2$,不显示用户名路径的问题

    原文链接: http://blog.csdn.net/testcs_dn/article/details/70482468

  5. 第31次Scrum会议(11/19)【欢迎来怼】

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/19 17:05~17:34,总计29min. 地 ...

  6. (第九周)Beta-1阶段成员贡献分

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...

  7. Notes of Daily Scrum Meeting(11.6 and 11.7)

    Notes of Daily Scrum Meeting(11.6 and 11.7) 因为七号星期五是放假的第一天,好几名队员要么是出去玩,要么是回家了,所以我们讨论之后在七号没有开始代码的编写, ...

  8. [buaa-SE-2017]个人作业-Week1

    个人作业-Week1 Part1:教材中不懂的问题 1.根据书中"除了前20的学校之外,计科和软工没有区别"所以计算机科学这个专业也许在我们学校是和软件工程有区别的,但是可以料想的 ...

  9. 20172329 2018-2019《Java程序设计与数据结构》课程总结

    作者:lalalouye(20172329王文彬) 2018-2019年大二Java程序设计与数据结构课程总目录:第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 实验一 实验二 ...

  10. 20172325 2016-2017-2 《Java程序设计》第四周学习总结

    20172325 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 1.对类.对象.声明变量的定义和属性有了进一步的了解 2.学会如何编写一个类并运用到需要的程 ...