正题

题目链接:https://www.luogu.com.cn/problem/P2490


题目大意

一个长度为nnn的棋盘上放下kkk个棋子。

第一个要是白色,下一个要是黑色,在下一个是白色以此类推。

先手操控白,后手操控黑。白色只能往右,黑色只能往左。每次操作的可以移动ddd个棋子任意步。

求先手必胜的初始状态数

1≤d≤k≤n≤104,1≤k≤1001\leq d\leq k\leq n\leq 10^4,1\leq k\leq 1001≤d≤k≤n≤104,1≤k≤100且kkk为偶数


解题思路

把两个黑白棋子之间的长度看为石头堆就是一个NimkNim_kNimk​游戏了。

NimkNim_kNimk​游戏的结论就是k+1k+1k+1进制下各个位置的111的个数%(k+1)\% (k+1)%(k+1)等于000的话先手必败。

因为先手必胜比较麻烦,考虑减去先手必败的情况

这个东西和昨天的一道ARCARCARC的题目很像,每个位分开考虑,设fi,jf_{i,j}fi,j​表示前iii个位都是000时,用了jjj个石头的方案。

那么转移也十分显然,枚举一个选的倍数iii然后分配到k2\frac{k}{2}2k​个石头堆中,方案数就是(k2i×(d+1))\binom{\frac{k}{2}}{i\times (d+1)}(i×(d+1)2k​​)。

然后统计答案的时候对于石子和为iii的贡献就是(n−k2−ik2)\binom{n-\frac{k}{2}-i}{\frac{k}{2}}(2k​n−2k​−i​)(因为每一堆的个数固定,所以选择起点就好了)

时间复杂度O(nklog⁡n)O(nk\log n)O(nklogn)


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. BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)

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

  3. [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

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

  4. bzoj 2281: [Sdoi2011]黑白棋 bzoj 4550: 小奇的博弈(Nimk博弈+DP)

    4550: 小奇的博弈 Time Limit: 2 Sec  Memory Limit: 256 MB Submit: 68  Solved: 42 [Submit][Status][Discuss] ...

  5. 【bzoj2281】[Sdoi2011]黑白棋

    博弈论---Nimk问题. dp再搞搞. 很容易看出,该游戏的终态是每两个棋子都紧靠着.当一颗棋子移动,另一方与该棋子对应的那一刻可以立即追上,使得仍旧紧靠,最终棋子动弹不得,游戏结束. 还能看出,对 ...

  6. android 双人黑白棋开发博客,黑白棋 - 软件资讯 - 课堂党年级博客

    黑白棋叫反棋(Reversi).奥赛罗棋(Othello)苹棋翻转棋黑白棋西本流行游戏通相互翻转棋棋盘谁棋判断胜负 黑白棋棋盘8*8格棋盘棋棋空格间像围棋交叉点始棋盘两白两黑四棋交叉放置黑棋总先 自颜 ...

  7. P3084 黑白棋游戏

      P3084 黑白棋游戏 时间: 1000ms / 空间: 65536KiB / Java类名: Main 描述 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和 ...

  8. 跟我一起使用 compose 做一个跨平台的黑白棋游戏(2)界面布局

    前言 在上一篇文章中,我们讲解了实现这个游戏的总体思路,这篇文章我们将讲解如何实现游戏界面. 本文将涉及到 compose 的自定义绘制与触摸处理,这些内容都可以在我往期的文章中找到对应的教程,如果对 ...

  9. 51nod 1368:黑白棋 二分图最大匹配

    1368 黑白棋 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  取消关注 有一个N*M的棋盘(1<=N,M< ...

  10. 《算法竞赛入门经典》习题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 ...

最新文章

  1. swift和OC - 拆分数组 和 拆分字符串
  2. android中TextView显示中文发生乱码的问题
  3. python二十四:python练习题
  4. boost::range模块transformed相关的测试程序
  5. python模块离线安装_离线安装db2的python模块ibm_db
  6. A Style-Based Generator Architecture for Generative Adversarial Networks---阅读笔记
  7. fckeditor零碎要点---3.FCK:editor instanceName=myeditor value=李德伟欢迎您 height=400/FCK:editor
  8. java switch中标签重复_java程序 怎样把id相同的记录挑出来,分别存到不同的文件中,除了switch case,数据量很大,id种类很多。...
  9. JavaWeb——springMVC异常处理器
  10. ubuntu16.04安装cuda11.3、cudnn8.2.1、tensorrt8.0.3.4全过程
  11. java 回收器有几种_Java垃圾回收器种类
  12. AutoCAD如何设置A0A1图纸
  13. Flashed Ball
  14. 《HelloGitHub》第 65 期
  15. c语言快速判断一个数是偶数还是奇数
  16. Dubbo3.0系列(6)- Dubbo3.0支持的RPC协议
  17. C 标准库 - 参考手册
  18. “/”与“\”以及“//”与“\\”之间的区别 (转)
  19. CentOS7定时任务配置与使用
  20. iOS底层开发消息发送与转发流程

热门文章

  1. wince导航_宁可用手机导航,也不用汽车导航?
  2. 获取 子文件夹 后缀_CSDN学院第一个Ptython Homework-- 递归统计文件夹大小
  3. docker 修改阿里镜像源_Jetson Nano 修改源镜像
  4. curd什么意思中文_每日一句英译英:She's a ten什么意思?
  5. c语言字符比较思路,C语言讲解思路资料
  6. android 带弧形背景,[Android日常]绘制弧形渐变背景
  7. android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信
  8. 错误代码1500什么意思_啊早安打工人是什么梗???
  9. 软件构造学习笔记-第十一周
  10. 7-2 作业调度算法--短作业优先 (30 分)(思路+详解+vector容器做法)Come Baby!!!!!!!!!!!