怎么SDOI2011和SDOI2019的两道题这么像啊。。(虽然并不完全一样)

题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2281

(luogu) https://www.luogu.org/problemnew/show/P2490

题解: 博弈论好难啊完全学不来QAQ

题目里应该有个限制,是先手不能左移,后手不能右移。

简单转化一发,就相当于有\(n\)堆石子,每次从\(1\)到\(d\)堆中取走任意多个,最后取完的人输。

其实这就是个Nim博弈套Bash博弈。

然后……然后我就不会了。

按理说……\(d=1\)的时候异或和为\(0\), 也就是每个二进制位\(1\)的个数为偶数,那么这个不是连猜都能猜出来每个二进制位\(1\)的个数为\((d+1)\)的倍数吗……Nim博弈套Bash博弈啊……

然后感性理解一下(可能也能算个证明吧): 考虑\(d=1\) Nim游戏的正确性,显然异或和为\(0\)时先手能且仅能将其变为不为\(0\),而后手在这之后能将其变为为\(0\). 假设先手动的最高位为\(i\), 则后手动第\(i\)位上为\(1\)的另一个石子,下面的变成与之对应的即可。归纳可证。那么考虑\(d>1\), 当所有数出现次数均为\((d+1)\)的倍数时,先手不可能依然变为出现次数均为\((d+1)\)的倍数;从高到低考虑位\(j\), 设现在已经改变的堆数为\(t\),\(t\)个数中有\(a\)个在位\(j\)上为\(1\), \(b\)个为\(0\), 并假设后手改动前这一位上\(1\)的个数模\((d+1)\)总共是\(x\). 若\(a\ge x\), 则改变这\(a\)个中的\(x\)个即可;若\(b\ge d+1-x\)则可以把\(b\)个中的\((d+1-x)\)个从\(0\)变成\(1\); 否则另外选择\(t\)堆之外的\((x-a)\)堆变成\(1\), 则选的总数为\((x-a)+a+b=x+b\le d+1-b+b=d+1\), 故移动依然合法。(怎么写着写着就变成抄别的题解了……)

然后问题转化为求\(m\)个数和为\(n\)二进制每一位\(1\)的个数都为\((d+1)\)的倍数的方案数。(计数我也不会啊呜呜呜……)

设\(dp[i][j]\)表示考虑二进制低\(i\)位,和为\(j\)的方案数,随便枚举一下转移即可

时间复杂度很低。

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std;inline int read()
{int x=0; bool f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=0;for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');if(f) return x;return -x;
}const int P = 1e9+7;
const int N = 2e4;
const int LGN = 14;
llong fact[N+3],finv[N+3];
llong dp[LGN+3][N+3];
int n,m,d;llong quickpow(llong x,llong y)
{llong cur = x,ret = 1ll;for(int i=0; y; i++){if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}cur = cur*cur%P;}return ret;
}
llong comb(llong x,llong y) {return x<0||y<0||x<y ? 0ll : fact[x]*finv[y]%P*finv[x-y]%P;}int main()
{fact[0] = 1ll; for(int i=1; i<=N; i++) fact[i] = fact[i-1]*i%P;finv[N] = quickpow(fact[N],P-2); for(int i=N-1; i>=0; i--) finv[i] = finv[i+1]*(i+1)%P;scanf("%d%d%d",&n,&m,&d); n-=m; m>>=1;for(int i=0; i*(d+1)<=m && i*(d+1)<=n; i++){dp[0][i*(d+1)] = comb(m,(d+1)*i);}for(int i=1; i<=LGN; i++){for(int j=0; j<=n; j++){llong cur = dp[i-1][j];if(cur){for(int k=0; j+(d+1)*k*(1<<i)<=n && (d+1)*k<=m; k++){llong tmp = cur*comb(m,(d+1)*k);dp[i][j+(d+1)*k*(1<<i)] = (dp[i][j+(d+1)*k*(1<<i)]+tmp)%P;}}}}llong ans = 0ll;for(int i=0; i<=n; i++){llong tmp = comb(n+m-i,m)*dp[LGN][i];ans = (ans+tmp)%P;}ans = (comb(n+m+m,m+m)-ans+P)%P;printf("%lld\n",ans);return 0;
}

BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)相关推荐

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

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

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

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

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

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

  4. 【bzoj2281】[Sdoi2011]黑白棋

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

  5. BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...

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

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

  7. P7589 黑白棋(2021 CoE-II B

    原题P7589 黑白棋(2021 CoE-II B) 题目描述 \text{Alice}Alice 和 \text{Bob}Bob 正在玩一种称为"黑白棋"的游戏.该游戏的规则如下 ...

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

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

  9. UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)

    UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组.ST表) 连NOI Day1T1都不会做...看了题解都写不出来还要抄Claris的代码.. 题 ...

最新文章

  1. XPE一般性组件整理
  2. JavaXml教程(六)使用JDOM解析XML文件
  3. 北航计算机梅澜,水江澜-北京航空航天大学材料科学与工程学院
  4. yii2史上最简单式安装教程,没有之一
  5. kruskal 重构树(讲解 + 例题)
  6. 镜像安装linux选择内核版本,在CentOS和Ubuntu中安装Linux Kernel 4.13.10
  7. Eclipse如何快速找到某个选项
  8. php 操件文件指定编码,(PHP帮助)如果文件中存在特定编号,请执行此操作
  9. HDU - 4780费用流
  10. IoT实时数据可视化方案(进阶版):Worldmap Panel使用详解及使用Node-RED进行流程管理...
  11. Javascript作用域、闭包原理以及性能问题
  12. Android驱动工程师职位要求
  13. Qt QLabel双击编辑接口
  14. android项目中如何导入model
  15. 网络安全DOS攻击✍
  16. 非线性回归 python_回归算法之非线性回归
  17. MBA管理学知识点笔记
  18. 桌面视频录制软件有哪些?怎么简单又快地录制视频?
  19. 迪士尼电影经过多年的
  20. 自动驾驶域控制器话题下的软件系统设计和研发管理

热门文章

  1. 云炬Android开发笔记 10主界面-首页UI与数据解析器开发(RecyclerView)
  2. 云炬Android开发教程 Android Studio自带的AVD模拟器安装教程
  3. 第18课:项目实战——利用 PyTorch 构建 RNN 模型
  4. 【SVM最后一课】详解烧脑的Support Vector Regression
  5. 吴恩达《序列模型》精炼笔记(2)-- NLP和Word Embeddings
  6. 单列表_正态分布检验(单样本K-S检验)
  7. Siamese Network (应用篇1) :孪生网络特征用于图像匹配 ICPR2016
  8. 串口通信模块5:串口操作自定义类(2)
  9. 问题总结:判断MS SQLSERVER临时表是否存在 drop table #tempcitys
  10. 23种设计模式C++源码与UML实现--责任链模式