BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)
Description
Input
Output
输出小A胜利的方案总数。答案对1000000007取模。
Sample Input
Sample Output
HINT
1<=d<=k<=n<=10000, k为偶数,k<=100。
Solution
我组合计数和$DP$真的是菜的真实……
首先这个题必须加一个限制条件:先手只能向右,后手只能向左,不然下面的做法会被黄学长找出来反例……?QAQ 不过还是能过的我也不知道为什么
首先比较容易发现,因为每个人操作的方向是一定的,所以可以把一对相邻的黑白棋中间的格子数看成一堆石子,那么这个就变成了一个有$k/2$堆的$Nim$游戏。只不过这个$Nim$游戏一次可以取$1 \sim d$堆,也就是$k-Nim$游戏。
$k-Nim$游戏的先手必败态是把每堆石子转换为二进制后,其中每一位上为1的个数和都能被$(d+1)$整除。
感性理解还是挺正确的……具体证明戳这里吧。
然后就可以开始$DP$了。设$f[i][j]$表示$DP$到了二进制的第$i$位,用了$j$个棋子的必败态方案数。
$f[i][j]= \sum f[i-1][j-l \times (d+1) \times 2^i]*C_{k/2}^{l \times (d+1)}$
(这一次用了$l \times (d+1) \times 2^i$个石子,乘组合数是因为从$k/2$堆石子里选出$k \times (d+1)$堆。)
最后答案为$C_n^k-\sum_{i=0}^{n-k}f[15][i] \times C_{n-k/2-i}^{k/2}$
(乘组合数是因为每对棋子在棋盘上的距离确定了,就差每对棋子的排列方式了。)
Code
#include<iostream>
#include<cstdio>
#define N (10009)
#define LL long long
#define MOD (1000000007)
using namespace std; LL n,k,d,p[],C[N][],f[][N]; void Init()
{
p[]=;
for (int i=; i<=; ++i) p[i]=p[i-]<<;
C[][]=;
for (int i=; i<=n; ++i)
for (int j=; j<=min(*k,(LL)i); ++j)
{
(C[i][j]+=C[i-][j])%=MOD;
if (j) (C[i][j]+=C[i-][j-])%=MOD;
}
} int main()
{
scanf("%lld%lld%lld",&n,&k,&d);
Init();
f[][]=;
for (int i=; i<=; ++i)
for (int j=; j<=n-k; ++j)
for (int l=; l*(d+)<=k/&&l*(d+)*p[i-]<=j; ++l)
(f[i][j]+=f[i-][j-l*(d+)*p[i-]]*C[k/][l*(d+)]%MOD)%=MOD;
LL ans=;
for (int i=; i<=n-k; ++i)
(ans+=f[][i]*C[n-k/-i][k/]%MOD)%=MOD;
ans=(C[n][k]-ans+MOD)%MOD;
printf("%lld\n",ans);
}
BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)的更多相关文章
- BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)
怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...
- [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec Memory Limit: 512 MBSubmit: 626 Solved: 390[Submit][Status][ ...
- BZOJ 2281: [Sdoi2011]黑白棋 (Nim游戏+dp计数)
题意 这题目有一点问题,应该是在n个格子里有k个棋子,k是偶数.从左到右一白一黑间隔出现.有两个人不妨叫做小白和小黑.两个人轮流操作,每个人可以选 1~d 枚自己颜色的棋子,如果是白色则只能向右移动, ...
- BZOJ2281[Sdoi2011]黑白棋&BZOJ4550小奇的博弈——DP+nimk游戏
题目描述 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色 ...
- BZOJ2281 [SDOI2011]黑白棋 【dp + 组合数】
题目 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色棋子 ...
- bzoj2281 [Sdoi2011]黑白棋
一眼$nimk$游戏,后来觉得不对劲,看了黄学长博客发现真的不是$nimk$. 就当是$nimk$做吧,那么我们要保证每一位上一的个数都是$d+1$的倍数. $dp$:$f[i][j]$表示从低到高第 ...
- luoguP2490 [SDOI2011]黑白棋 博弈论 + 动态规划
博弈部分是自己想出来的,\(dp\)的部分最后出了点差错QAQ 从简单的情况入手 比如\(k = 2\) 如果有这样的局面:$\circ \bullet $,那么先手必输,因为不论先手怎样移动,对手都 ...
- 【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)
[BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...
- Bzoj 2281 [Sdoi2011]黑白棋 题解
2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec Memory Limit: 512 MBSubmit: 592 Solved: 362[Submit][Status][ ...
随机推荐
- videojs IE8无法播放解决方案
1.如果是在.cs文件里初始化视频元素,没有遇到无法播放问题. 2.如果是js动态换播放器的poster和src遇到此问题,解决办法是用videojs提供的函数来设置 https://github.c ...
- Servlet的数据库访问
创建数据库: import java.sql.*; public class SqlUtil { static { try { Class.forName("com.mysql.jdbc ...
- HDU 2824 The Euler function --------欧拉模板
The Euler function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Leet Palindrome Partitioning II
class Solution { public: int minCut(string s) { int len = s.length(); ]; char* s_dp = new char[len * ...
- python3中的新式类mro查看和C3算法原理
两个公式 L(object) = [object] L(子类(父类1, 父类2)) = [子类] + merge(L(父类1), L(父类2) , [父类1, 父类2])注意 + 代表合并列表 mer ...
- 关于android R.layout 中找不到已存在的布局文件问题的解决
今天遇到一个很奇怪的问题,打R.layout.,居然不会提示已经写好的布局文件,自己把xml文件名打下去后,居然提示错误. 开始以为是R文件中没有自动生成关于布局文件对应的整型,看了R文件,其实是有生 ...
- 简洁php的MVC框架
一.文件结构 建立3个文件夹 controller文件夹存放控制器文件 view文件夹存放视图文件 model文件夹存放数据文件 建立1个index.php 作为唯一入口 二.控制器 我们在contr ...
- needPrint 不显示打印按钮
客户问题: 客户用的是needPrint 来显示打印按钮,现在访问不能显示后台提示有错误 打开控制台显示: java.security.AccessControlException: ...
- 使用jar命令打jar/war包、创建可执行jar包、运行jar包、及批处理脚本编写
jar 命令 jar 是一个jar.exe可执行命令,即可以生成jar文件,也可以生成war文件 使用示例:jar -cvf ../xxx.jar * -c create,创建新的归档文档 ...
- C#Owin auth20开发 OwinStartup 不会触发的解决办法
在使用owin auth20设置token时候遇到一个问题.项目中已经存在如下初始化配置类 using Microsoft.Owin; using Owin; [assembly: OwinStart ...