Bzoj 2281 [Sdoi2011]黑白棋 题解
2281: [Sdoi2011]黑白棋
Time Limit: 3 Sec Memory Limit: 512 MB
Submit: 592 Solved: 362
[Submit][Status][Discuss]
Description
Input
Output
输出小A胜利的方案总数。答案对1000000007取模。
Sample Input
Sample Output
HINT
1<=d<=k<=n<=10000, k为偶数,k<=100。
Source
感受到了被博弈论支配的恐惧……
上来将题意理解为了白棋统一向右走,黑棋统一向左走,只要移动黑白棋就会碰到一起,然后就成了一个裸的nim博弈,然后就没有然后了……
后来看黄学长的题解领悟到正确思路后默默的跪膜……
首先我们先确认一下游戏结束的条件,如果A失败就是所有黑白棋都挨在一起且都挤在左侧,反之则都挤在右侧,原理显然。
那么我们可以发现,如果我们想胜利白棋一定不会向左移,黑棋一定不会向右移,所以,我们可以发现当每一个白棋都和他左边的黑棋碰到一起时游戏实际上就已经结束了。所以,我们可以将相邻的两个棋子配成k/2对,目标实际就转化为了有k/2堆石子一次最少取一个堆里的任意颗石子,最多取d堆里的任意石子。谁先无法行动谁就失败。这就是传说中的nimk模型。(lc:只要你多看几眼论文就会发现这些奇奇怪怪的名词)
对于nimk模型,先手必败当且仅当对于二进制每一位,如果所有堆的石子数二进制这一位1的和都能被(d+1)整除。
证明:
这种“谁不能移谁就输”的游戏先手必败就是当后手可以以某种对称的方式使你每走一步他都可以走一步实质完全一样的与你对应。表现在这道题里就是当你在二进制里的第i位取x个1时,他只要取d+1-x个就好了。
不过这道题我们并不是要去判断是否合法, 而是计算方案数。
为了方便,我们可以通过融斥去求答案。我们设f[i][j]为考虑了所有堆二进制前i位,已经在堆里面一共放了j个石子的方案数。转移方程即为:f[i+1][j+k*(d+1)*(1<<i)]+=f[i][j]*C(K/2,k*(d+1))。这里的K我指的是题目中的k,k*(d+1)就是枚举一共放多少组,C(K/2,k*(d+1))代表究竟放到哪一堆里。最后累加的时候记得再算上我们剩余的石子的摆放数,最终拿C(n,k)减去不合法方案数即可。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#define N 10005
using namespace std;
int n,m,d,p=;
long long ksm(long long a,long long z)
{
long long ans=;
while(z)
{
if(z&) ans*=a,ans%=p;
a*=a;
a%=p;
z>>=;
}
return ans;
}
long long jc[N],ni[N];
long long get_c(int x,int y)
{
return ((jc[x]*ni[y]%p)*ni[x-y]%p)%p;
}
long long f[][N];
int main()
{
scanf("%d%d%d",&n,&m,&d);
if(m==)
{
printf("%lld\n",1ll*(n-)*(n-)/);
exit();
}
jc[]=ni[]=;
for(int i=;i<=n;i++) jc[i]=(jc[i-]*i)%p;
ni[n]=ksm(jc[n],p-);
for(int i=n-;i;i--) ni[i]=ni[i+]*(i+)%p;
f[][]=;
for(int i=;i<=;i++)
{
for(int j=;j<=n-m;j++)
{
for(int k=;j+(d+)*k*(<<i)<=n-m&&(d+)*k<=m/;k++)
{
f[i+][j+(d+)*k*(<<i)]+=f[i][j]*get_c(m/,k*(d+));
f[i+][j+(d+)*k*(<<i)]%=p;
}
}
}
long long ans=;
for(int i=;i<=n-m;i++)
ans+=f[][i]*get_c(n-i-m/,m/)%p,ans%=p;
printf("%lld\n",(get_c(n,m)-ans+p)%p);
return ;
}
Bzoj 2281 [Sdoi2011]黑白棋 题解的更多相关文章
- bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)
黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...
- BZOJ 2281: [Sdoi2011]黑白棋 (Nim游戏+dp计数)
题意 这题目有一点问题,应该是在n个格子里有k个棋子,k是偶数.从左到右一白一黑间隔出现.有两个人不妨叫做小白和小黑.两个人轮流操作,每个人可以选 1~d 枚自己颜色的棋子,如果是白色则只能向右移动, ...
- BZOJ 2281: [Sdoi2011]黑白棋(dp+博弈论)
传送门 解题思路 首先发现可以把相邻的黑白棋子之间的距离看成一堆棋子,那么这个就可以抽象成\(Nim\)游戏每次可以取\(d\)堆这个游戏,而这个游戏的\(SG\)值为\(x\%(d+1)\),那么题 ...
- bzoj 2281: [Sdoi2011]黑白棋
再次,,,,,虚(一开始看错题了,看成一次移动一个棋子,能移动1-d个格子...这样的话有没有大神会做??本蒟蒻就教) 额,,直接%%%%把...http://hzwer.com/5760.html ...
- [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec Memory Limit: 512 MBSubmit: 626 Solved: 390[Submit][Status][ ...
- 【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)
[BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...
- P2490 [SDOI2011]黑白棋
P2490 [SDOI2011]黑白棋 题意 一个 \(1*n\) 的棋盘上,A 可以移动白色棋子,B 可以移动黑色的棋子,其中白色不能往左,黑色不能往右.他们每次操作可以移动 1 到 \(d\) 个 ...
- 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋
Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...
- [SDOI2011]黑白棋
Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...
随机推荐
- 在 Laravel 中通过 Artisan View 扩展包创建及删除应用视图文件
1.简介 本扩展包添加了两个视图相关的Artisan命令到Laravel应用,以便我们通过Artisan命令即可创建和管理视图文件,可谓是进一步解放了生产力. 2.安装 还是通过Composer安装: ...
- 给Delphi程序添加版本信息(EXE和Dll)
我们在用Delphi编译完程序,准备发布产品时,总希望随产品发布个性信息以标示产品的来源以及开发者等信息,就像windows的程序一样,使我们一看属性就知道他是微软的产品,这些在Delphi中是如何实 ...
- VS2013环境里安装QT插件-“X86”与目标计算机类型“x64”冲突
在VS2013环境里搭载QT老是出现模块计算机类型“X86”与目标计算机类型“x64”冲突 2.解决方案2.1 项目右键,属性>配置管理选择>x64,没有的话新建:2.2 项目右键,属性 ...
- SEED缓冲区溢出实验笔记
缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...
- 无法删除 NTFS 盘上的文件或文件夹(对Windows文件的各种情况有比较详细的描述)
简介 本文介绍您可能无法删除 NTFS 文件系统卷上的文件或文件夹的原因,以及如何分析造成此问题的不同原因从而解决此问题. 更多信息 注意:在内部,NTFS 将文件夹作为特殊类型的文件进行处理.因此, ...
- WPF 调用API修改窗体风格实现真正的无边框窗体
原文:WPF 调用API修改窗体风格实现真正的无边框窗体 WPF中设置无边框窗体似乎是要将WindowStyle设置为None,AllowTransparency=true,这样才能达到WinForm ...
- UWP入门(八)--几个简单的控件
原文:UWP入门(八)--几个简单的控件 每天看几个,要不聊几天我就可以看完啦,加油! 看效果 1. CheckBox <TextBlock Grid.Row="0" Tex ...
- layer 1.9.2 发布,国产 Web 弹层不懈的前行者
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...
- 什么是Android NDK
1.NDK是一系列工具的集合. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK集成了交叉编译 ...
- 【转】简单的jQuery插件开发方法
在实际开发工作中,总会碰到像滚动,分页,日历等展示效果的业务需求,对于接触过jQuery以及熟悉jQuery使用的人来说,首先想到的肯定是寻找现有的jQuery插件来满足相应的展示需求.目前页面中常用 ...