正题

题目链接: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】的更多相关文章

  1. BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)

    怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...

  2. P2490 [SDOI2011]黑白棋

    P2490 [SDOI2011]黑白棋 题意 一个 \(1*n\) 的棋盘上,A 可以移动白色棋子,B 可以移动黑色的棋子,其中白色不能往左,黑色不能往右.他们每次操作可以移动 1 到 \(d\) 个 ...

  3. BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)

    Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...

  4. luoguP2490 [SDOI2011]黑白棋 博弈论 + 动态规划

    博弈部分是自己想出来的,\(dp\)的部分最后出了点差错QAQ 从简单的情况入手 比如\(k = 2\) 如果有这样的局面:$\circ \bullet $,那么先手必输,因为不论先手怎样移动,对手都 ...

  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. [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 626  Solved: 390[Submit][Status][ ...

  9. 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋

    Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...

  10. BZOJ 2281: [Sdoi2011]黑白棋 (Nim游戏+dp计数)

    题意 这题目有一点问题,应该是在n个格子里有k个棋子,k是偶数.从左到右一白一黑间隔出现.有两个人不妨叫做小白和小黑.两个人轮流操作,每个人可以选 1~d 枚自己颜色的棋子,如果是白色则只能向右移动, ...

随机推荐

  1. C# 调用C++结构体

    参考网址:C#调用C/C++动态库,封装各种复杂结构体._liguo9860的专栏-CSDN博客 现在公司要做一个使用C#程序调用C++的一个DLL库,解析文件的功能.所以在网上找了一些资料.     ...

  2. vue:Missing space before value for key 'components'

    原因是Vue对语法比较严格,而eslint是一个语法检查工具,对语法要求极其苛刻严格,于是就error了 解决办法是关闭eslint的语法规则,找到build/webpack.base.conf.js ...

  3. 【mysql】mysql逻辑框架简介及show profile说明

    1.mysql逻辑框架简介 和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数 ...

  4. 复习git

    git 常用点,详解 from my typora 文章目录 git 常用点,详解 git 模式解析 删除文件 方式一: 方式二: 远程库 配置忽略文件 查看版本库日志,以及版本回退 解决冲突 替换我 ...

  5. 了解Prometheus

    了解Prometheus 标签(空格分隔): 监控 介绍 Prometheus是用来收集和存储服务器的实时数据(比如:CPU.硬盘.服务响应.日志等),通过其丰富的运算函数,可以计算得到很多的服务性能 ...

  6. 三大操作系统对比使用之·Ubuntu16.04

    时间:2018-11-13 整理:byzqy 本篇是一篇个人对 Ubuntu 16.04(桌面版)使用方法.技巧以及应用推荐的文章,以便查询和分享! 打开终端: Ctrl+Alt+T,即可打开&quo ...

  7. 源码解析.Net中Middleware的实现

    前言 本篇继续之前的思路,不注重用法,如果还不知道有哪些用法的小伙伴,可以点击这里,微软文档说的很详细,在阅读本篇文章前,还是希望你对中间件有大致的了解,这样你读起来可能更加能够意会到意思.废话不多说 ...

  8. Docker下制作一个容器镜像

    操作过程描述: (1)先基于centos的镜像启动一个centos容器 (2)在这个容器中安装nginx (3)然后把这个已经安装了nginx的容器制作成一个docker的镜像 操作:docker c ...

  9. ABP VNext发布遇到的坑

    本地调试没有问题,发布后通过Token调用其他API时,出现返回JSON中提示:Authorization failed! Given policy has not granted. 需要修改apps ...

  10. Winform EF CodeFist方式连接数据库

    直接生成ado.net 实体数据模型挺方便的,但只有一步步的手写代码才能更好的理解EF,在学习asp.net core过程中手写代码已经明白了怎么回事,但实现过程有些麻烦不知道如何记录,但Winfor ...