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
1 #include<iostream> 2 #include<cstdio> 3 #define N (10009) 4 #define LL long long 5 #define MOD (1000000007) 6 using namespace std; 7 8 LL n,k,d,p[19],C[N][209],f[19][N]; 9 10 void Init() 11 { 12 p[0]=1; 13 for (int i=1; i<=16; ++i) p[i]=p[i-1]<<1; 14 C[0][0]=1; 15 for (int i=1; i<=n; ++i) 16 for (int j=0; j<=min(2*k,(LL)i); ++j) 17 { 18 (C[i][j]+=C[i-1][j])%=MOD; 19 if (j) (C[i][j]+=C[i-1][j-1])%=MOD; 20 } 21 } 22 23 int main() 24 { 25 scanf("%lld%lld%lld",&n,&k,&d); 26 Init(); 27 f[0][0]=1; 28 for (int i=1; i<=15; ++i) 29 for (int j=0; j<=n-k; ++j) 30 for (int l=0; l*(d+1)<=k/2&&l*(d+1)*p[i-1]<=j; ++l) 31 (f[i][j]+=f[i-1][j-l*(d+1)*p[i-1]]*C[k/2][l*(d+1)]%MOD)%=MOD; 32 LL ans=0; 33 for (int i=0; i<=n-k; ++i) 34 (ans+=f[15][i]*C[n-k/2-i][k/2]%MOD)%=MOD; 35 ans=(C[n][k]-ans+MOD)%MOD; 36 printf("%lld\n",ans); 37 }
转载于:https://www.cnblogs.com/refun/p/10105586.html
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 MB Submit: 626 Solved: 390 [Submit][Status ...
- 【bzoj2281】[Sdoi2011]黑白棋
博弈论---Nimk问题. dp再搞搞. 很容易看出,该游戏的终态是每两个棋子都紧靠着.当一颗棋子移动,另一方与该棋子对应的那一刻可以立即追上,使得仍旧紧靠,最终棋子动弹不得,游戏结束. 还能看出,对 ...
- bzoj 2281: [Sdoi2011]黑白棋 bzoj 4550: 小奇的博弈(Nimk博弈+DP)
4550: 小奇的博弈 Time Limit: 2 Sec Memory Limit: 256 MB Submit: 68 Solved: 42 [Submit][Status][Discuss] ...
- android 双人黑白棋开发博客,黑白棋 - 软件资讯 - 课堂党年级博客
黑白棋叫反棋(Reversi).奥赛罗棋(Othello)苹棋翻转棋黑白棋西本流行游戏通相互翻转棋棋盘谁棋判断胜负 黑白棋棋盘8*8格棋盘棋棋空格间像围棋交叉点始棋盘两白两黑四棋交叉放置黑棋总先 自颜 ...
- P3084 黑白棋游戏
P3084 黑白棋游戏 时间: 1000ms / 空间: 65536KiB / Java类名: Main 描述 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和 ...
- 跟我一起使用 compose 做一个跨平台的黑白棋游戏(2)界面布局
前言 在上一篇文章中,我们讲解了实现这个游戏的总体思路,这篇文章我们将讲解如何实现游戏界面. 本文将涉及到 compose 的自定义绘制与触摸处理,这些内容都可以在我往期的文章中找到对应的教程,如果对 ...
- 51nod 1368:黑白棋 二分图最大匹配
1368 黑白棋 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 取消关注 有一个N*M的棋盘(1<=N,M< ...
- 《算法竞赛入门经典》习题4-3 黑白棋(Othello, ACM、ICPC World Finals 1992, UVa220)
原题及翻译 Othello is a game played by two people on an 8 x 8 board, using disks that are white on one si ...
最新文章
- 智能车竞赛技术报告 | 单车拉力组 - 沈阳航空航天大学 - 青梅绿茶队
- Matlab 图论最短路问题模型代码
- POJ2044 深搜+剪枝(云彩下雨)
- Kali Linux安装Remmina无法加载RDP插件
- 如何让linux自动回收内存,linux – 什么可以导致非活动内存增加以及如何回收它?...
- 源码包安装mysql_源码包安装MySQL
- win7 32 php+mysql+apache环境_win7 搭建PHP环境(php+mysql+apache)
- POJ 1753 Flip Game 简单BFS
- 【原创·总结】影响sql查询性能的因素
- [2018.07.26 T2] 背包问题
- Afc2add与AppSync
- 怎么推广“外卖CPS项目”赚佣金?(饿了么美团外卖红包小程序搭建教程)
- VCF 文件 格式 详解
- gii无法访问 yii2_YII2框架访问gii、debug页面404的错误解决方法
- 人民币小写转大写算法
- 恒源云(GPUSHARE)_CV训练时容易忽视的数据标签问题
- 【NOIP2017提高组】轰炸
- c# 合并PDF小工具(合并PDF文件)
- 基于javaweb的毕业设计毕业论文管理系统(java+ssm+jsp+tomcat+mysql)
- APP开发已经没有前途了吗?APP开发人员未来何去何从?
热门文章
- Java云托管服务的开支削减策略
- 轻松记账工程冲刺第二阶段10
- 第九章 大网高级 ASA 高级设置
- UnicodeDecodeError: ‘ascii’ codec can’t decode...: ordinal not in range(128 问题解决
- 如何从sdcard读取文件
- 区块链之比特币的潜在激励
- 【No.5 类型转换导致的错误】
- 《Linux From Scratch》第二部分:准备构建 第三章:软件包与补丁- 3.1. 简介
- linux无法解析主机地址(could not resolve host)解决办法
- iOS9应用隐私控制-外部调用