P2490-[SDOI2011]黑白棋【博弈论,dp】
正题
题目链接:https://www.luogu.com.cn/problem/P2490
题目大意
一个长度为\(n\)的棋盘上放下\(k\)个棋子。
第一个要是白色,下一个要是黑色,在下一个是白色以此类推。
先手操控白,后手操控黑。白色只能往右,黑色只能往左。每次操作的可以移动\(d\)个棋子任意步。
求先手必胜的初始状态数
\(1\leq d\leq k\leq n\leq 10^4,1\leq k\leq 100\)且\(k\)为偶数
解题思路
把两个黑白棋子之间的长度看为石头堆就是一个\(Nim_k\)游戏了。
\(Nim_k\)游戏的结论就是\(k+1\)进制下各个位置的\(1\)的个数\(\% (k+1)\)等于\(0\)的话先手必败。
因为先手必胜比较麻烦,考虑减去先手必败的情况
这个东西和昨天的一道\(ARC\)的题目很像,每个位分开考虑,设\(f_{i,j}\)表示前\(i\)个位都是\(0\)时,用了\(j\)个石头的方案。
那么转移也十分显然,枚举一个选的倍数\(i\)然后分配到\(\frac{k}{2}\)个石头堆中,方案数就是\(\binom{\frac{k}{2}}{i\times (d+1)}\)。
然后统计答案的时候对于石子和为\(i\)的贡献就是\(\binom{n-\frac{k}{2}-i}{\frac{k}{2}}\)(因为每一堆的个数固定,所以选择起点就好了)
时间复杂度\(O(nk\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e4+10,M=110,P=1e9+7;
ll n,k,d,ans,C[N][M],f[16][N];
signed main()
{
scanf("%lld%lld%lld",&n,&k,&d);
C[0][0]=1;n-=k;k/=2;d++;
for(ll i=1;i<N;i++)
for(ll j=0;j<M;j++)
C[i][j]=((j?C[i-1][j-1]:0)+C[i-1][j])%P;
ll z=0;ans=C[n+2*k][k*2];f[0][0]=1;
for(ll p=1;p<=n;p<<=1){
z++;
for(ll j=0;j<=n;j++)
for(ll i=0;j+i*p*d<=n&&i*d<=k;i++)
(f[z][j+i*p*d]+=f[z-1][j]*C[k][i*d]%P)%=P;
}
for(ll i=0;i<=n;i++)
(ans+=P-f[z][i]*C[n+k-i][k]%P)%=P;
printf("%lld\n",ans);
return 0;
}
P2490-[SDOI2011]黑白棋【博弈论,dp】的更多相关文章
- BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)
怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...
- P2490 [SDOI2011]黑白棋
P2490 [SDOI2011]黑白棋 题意 一个 \(1*n\) 的棋盘上,A 可以移动白色棋子,B 可以移动黑色的棋子,其中白色不能往左,黑色不能往右.他们每次操作可以移动 1 到 \(d\) 个 ...
- BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)
Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...
- luoguP2490 [SDOI2011]黑白棋 博弈论 + 动态规划
博弈部分是自己想出来的,\(dp\)的部分最后出了点差错QAQ 从简单的情况入手 比如\(k = 2\) 如果有这样的局面:$\circ \bullet $,那么先手必输,因为不论先手怎样移动,对手都 ...
- BZOJ2281 [SDOI2011]黑白棋 【dp + 组合数】
题目 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色棋子 ...
- 【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)
[BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...
- Bzoj 2281 [Sdoi2011]黑白棋 题解
2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec Memory Limit: 512 MBSubmit: 592 Solved: 362[Submit][Status][ ...
- [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec Memory Limit: 512 MBSubmit: 626 Solved: 390[Submit][Status][ ...
- 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋
Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...
- BZOJ 2281: [Sdoi2011]黑白棋 (Nim游戏+dp计数)
题意 这题目有一点问题,应该是在n个格子里有k个棋子,k是偶数.从左到右一白一黑间隔出现.有两个人不妨叫做小白和小黑.两个人轮流操作,每个人可以选 1~d 枚自己颜色的棋子,如果是白色则只能向右移动, ...
随机推荐
- LeetCoded第20题题解--有效的括号
有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空 ...
- Mysql 中隐式转换
案例一:条件字段函数操作 假设你现在维护了一个交易系统,其中交易记录表 tradelog 包含交易流水号(tradeid).交易员 id(operator).交易时间(t_modified)等字段.为 ...
- twemproxy《一》
twemproxy 做redis客户端中间代理的时候,如果redis有密码时,需要在nutcracker.yml中添加密码:
- MySQL-后知知觉的索引
什么是索引? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能 非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重 ...
- ES6中函数调用自身需要注意的问题
在传统的递归调用中,可以采用如下方式 function sum(n) { return sum(n - 1) + n;} 但如今es6盛行,为了保持代码一致性,可以采用两种解决方式. 第一种,将thi ...
- [源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎
[源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎 目录 [源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎 0x00 摘要 0x01 前言 1.1 ...
- 性能测试必备命令(3)- lscpu
性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 显示有关CPU架构的信息 ...
- stream流思想应用
1.计算集合中某字段数值和 subTotal = subTotal+ complainCountResult.stream().filter(childSource->childSource.g ...
- Linux上安装服务器监视工具,名为Scout_Realtime。
如何从浏览器监视Linux服务器和进程指标 在服务器上安装Ruby 1.9.3+ sudo yum -y install rubygems-devel 在Linux系统上安装了Ruby之后,现在可以使 ...
- 可选链运算符、空值合并运算符 --应用到vue项目
1.npm安装 npm install @babel/plugin-proposal-optional-chaining // 可选链运算符 ?. npm install @babel/plugin- ...