正题

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


题目大意

1×n1\times n1×n的网格上有mmm个硬币,两个人轮流向前移动一个硬币但是不能超过前一个硬币,无法移动者输。
求有多少种情况先手必胜。


解题思路

竟然有我会的题,我感动

位置做差分再减去111之后就是一个经典的阶梯博弈问题了,结论就是奇数位置的异或和。

但是这题是计数,先让nnn减去mmm,然后正难则反考虑求总方案和后手必胜的情况,这样问题就变为有多少个长度为mmm的非负整数序列满足它们的和不超过nnn且奇数位置的异或和为000。

考虑枚举奇数位置的和,奇数位置个数为z=⌊m+12⌋z=\lfloor\frac{m+1}{2}\rfloorz=⌊2m+1​⌋,设fif_ifi​表示zzz个数的和为iii时异或和为000的方案数,这个状态直接计算起来很难搞。

可以枚举每一个位的111的数量,显然每一个位的111数量肯是偶数。然后用组合数转移即可。

然后设gig_igi​表示m−zm-zm−z个数和不超过iii的方案数,那么有gi=∑j=0i(j+m−z−1m−z−1)g_i=\sum_{j=0}^i\binom{j+m-z-1}{m-z-1}gi​=∑j=0i​(m−z−1j+m−z−1​),前缀和转移就好了。

然后答案就是(n+mm)−∑i=0nfign−i\binom{n+m}{m}-\sum_{i=0}^nf_ig_{n-i}(mn+m​)−∑i=0n​fi​gn−i​(注意这里的nnn已经减去mmm了),因为模数不是质数直接杨辉三角求就好了。

时间复杂度O(nmlog⁡m)O(nm\log m)O(nmlogm),当然肯定是跑不满的


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5,P=1e9+9;
ll n,m,ans,c[N][51],f[N],g[N];
signed main()
{scanf("%lld%lld",&n,&m);ans=0;if(n<=m)return puts("0")&0;c[0][0]=1;for(ll i=1;i<=n;i++)for(ll j=0;j<=min(i,m);j++)c[i][j]=((j?c[i-1][j-1]:0)+c[i-1][j])%P;n-=m;ll z=(m+1)/2;f[0]=1;for(ll i=1;i<=18;i++)for(ll j=n;j>=0;j--)for(ll k=1;k<=z/2;k++){if(j<(k*(1<<i)))break;(f[j]+=f[j-k*(1<<i)]*c[z][2*k]%P)%=P;}for(ll i=0;i<=n;i++)g[i]=(g[i-1]+c[i+m-z-1][m-z-1])%P;for(ll i=0;i<=n;i++)(ans+=f[i]*g[n-i]%P)%=P;printf("%lld\n",(c[n+m][m]-ans+P)%P);return 0;
}

P5363-[SDOI2019]移动金币【阶梯博弈,dp,组合数学】相关推荐

  1. HDU3389(阶梯博弈)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3389 题意:1-N带编号的盒子,当编号满足A>B && A非空 && ...

  2. P3480-[POI2009]KAM-Pebbles【阶梯博弈】

    正题 题目链接:https://www.luogu.com.cn/problem/P3480 题目大意 nnn个石头堆上进行Nim\text{Nim}Nim游戏,不过需要满足每次操作前后都有ai≤ai ...

  3. *【CodeForces - 859C 】Pie Rules (博弈dp,时光倒流)

    题干: You may have heard of the pie rule before. It states that if two people wish to fairly share a s ...

  4. 天池 在线编程 双向取数(博弈DP)

    文章目录 1. 题目 2. 解题 1. 题目 https://tianchi.aliyun.com/oj/245679029019779851/254275128279634585 有一个长度为n的数 ...

  5. LeetCode 1690. 石子游戏 VII(博弈DP)

    文章目录 1. 题目 2. 解题 1. 题目 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 . 有 n 块石子排成一排.每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获 ...

  6. LeetCode 486. 预测赢家(博弈DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个表示分数的非负整数数组. 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,-- . 每次一个 ...

  7. poj 1704 HDU-4315 阶梯博弈

    本博文只提供思路,不提供代码,需要代码的同学请访问他人博文 n个石子,每个石子占有一个位置,不超过前面石子的前提下可以向前挪任意格,最先把石子全挪出去的获胜 阶梯博弈详解https://blog.cs ...

  8. 阶梯博弈(尼姆博奕进阶)

    n个阶梯(编号1~n),每个阶梯上有ni个石子,从第 i+1 个阶梯可以拿若干个石子到第 i 个阶梯上,第 1 个阶梯可以拿到地面(可以看作第 0 个阶梯,或者你也可以叫它基层),无法执行操作(石子全 ...

  9. 阶梯博弈(Staircase Nim)

    阶梯博弈!!!下面阐述一下我对于阶梯博弈的理解..   首先是对阶梯博弈的阐述...博弈在一列阶梯上进行...每个阶梯上放着自然数个点..两个人进行阶梯博弈...每一步则是将一个集体上的若干个点( & ...

最新文章

  1. 递归下降语法分析程序
  2. tensorboard 远程
  3. Kosaraju算法(发现强连通分图算法)
  4. 深入理解simhash原理
  5. 判断对象是否为数组/函数
  6. 剑指offer所有的题目总结(转)
  7. vs2010报错:转换到 COFF 期间失败: 文件无效或损坏 解决方法
  8. 《算法导论》第7章 快速排序 (四种变形)
  9. windows批量上传文件到linux,windows上传文件到linux云服务器上
  10. 普通硬盘和固态硬盘的区别?
  11. 【数据湖Hudi-8-Hudi集成Flink-入门】
  12. 计算机两个用户怎么设置密码,电脑如何设置密码 电脑密码三个设置
  13. 双馈风机并网simulink模型
  14. 海外手机号码正则匹配
  15. PHPstudy 数据库基本操作
  16. 图像处理知多少?准大厂算法工程师30+场秋招后总结的面经问题详解
  17. 新发布!易聊 SCRM 正式上线
  18. 使用wireshark抓取ICMP流量包并分析ICMP协议
  19. android代码控制组件的移动,Android自定义控件实现随手指移动的小球
  20. 数据结构考研:电脑磁盘碎片的定义、产生原理和清理原因(文件碎片/机械硬盘/固态硬盘/硬盘清理/计算机/软件工程/王道论坛)

热门文章

  1. 四元数左乘右乘_四元数、欧拉角学习笔记个人理解
  2. startindex 不能大于字符串长度_玩转云端丨redis的5种对象与8种数据结构之字符串对象(下)...
  3. linux删除第二列为空_Linux之基本文本处理工具(二)
  4. ksu7对讲机调频软件_数字对讲机的群呼功能原理是什么?你了解多少?
  5. 算法设计与分析——递归与分治策略——最接近点对问题
  6. Redux从入门到进阶,看这一篇就够了!
  7. 幂等问题 vs 如何判断是否是4的幂
  8. [SpringSecurity]web权限方案_CSRF功能
  9. [JavaWeb-HTML]HTML特殊字符表
  10. [设计模式]依赖倒转原则