P5363-[SDOI2019]移动金币【阶梯博弈,dp,组合数学】
正题
题目链接:https://www.luogu.com.cn/problem/P5363
题目大意
\(1\times n\)的网格上有\(m\)个硬币,两个人轮流向前移动一个硬币但是不能超过前一个硬币,无法移动者输。
求有多少种情况先手必胜。
解题思路
竟然有我会的题,我感动
位置做差分再减去\(1\)之后就是一个经典的阶梯博弈问题了,结论就是奇数位置的异或和。
但是这题是计数,先让\(n\)减去\(m\),然后正难则反考虑求总方案和后手必胜的情况,这样问题就变为有多少个长度为\(m\)的非负整数序列满足它们的和不超过\(n\)且奇数位置的异或和为\(0\)。
考虑枚举奇数位置的和,奇数位置个数为\(z=\lfloor\frac{m+1}{2}\rfloor\),设\(f_i\)表示\(z\)个数的和为\(i\)时异或和为\(0\)的方案数,这个状态直接计算起来很难搞。
可以枚举每一个位的\(1\)的数量,显然每一个位的\(1\)数量肯是偶数。然后用组合数转移即可。
然后设\(g_i\)表示\(m-z\)个数和不超过\(i\)的方案数,那么有\(g_i=\sum_{j=0}^i\binom{j+m-z-1}{m-z-1}\),前缀和转移就好了。
然后答案就是\(\binom{n+m}{m}-\sum_{i=0}^nf_ig_{n-i}\)(注意这里的\(n\)已经减去\(m\)了),因为模数不是质数直接杨辉三角求就好了。
时间复杂度\(O(nm\log m)\),当然肯定是跑不满的
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,组合数学】的更多相关文章
- # [SDOI2019]移动金币 阶梯博弈 dp
[SDOI移动金币 链接 vijos 思路 阶梯博弈,dp统计. 参见wxyww 代码 #include <bits/stdc++.h> using namespace std; cons ...
- Luogu5363 SDOI2019移动金币(博弈+动态规划)
容易想到可以转化为一个有m堆石子,石子总数不超过n-m的阶梯博弈.阶梯博弈的结论是相当于只考虑奇数层石子的nim游戏. nim和不为0不好算,于是用总方案数减掉nim和为0的方案数.然后考虑dp,按位 ...
- Luogu P5363 [SDOI2019]移动金币
话说这题放在智推里好久了的说,再不写掉对不起自己233 首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客 那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一 ...
- HDU 4315 Climbing the Hill (阶梯博弈转尼姆博弈)
Climbing the Hill Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Su ...
- POJ1704 Georgia and Bob (阶梯博弈)
Georgia and Bob Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Subm ...
- HDU 4315:Climbing the Hill(阶梯博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=4315 题意:有n个人要往坐标为0的地方移动,他们分别有一个位置a[i],其中最靠近0的第k个人是king,移动的 ...
- hdu 3389 Game (阶梯博弈)
#include<stdio.h> int main() { int t,n,ans; int i,j,x; scanf("%d",&t); ;j<=t; ...
- HDU 5623 KK's Number (博弈DP)
KK's Number 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/K Description Our lovely KK h ...
- poj 1704 阶梯博弈
转自http://blog.sina.com.cn/s/blog_63e4cf2f0100tq4i.html 今天在POJ做了一道博弈题..进而了解到了阶梯博弈...下面阐述一下我对于阶梯博弈的理解. ...
随机推荐
- PQGrid商业化的表格组件
官网地址https://paramquery.com/pro/grid 右侧导航条有目录哟,看着更方便 快速入门 表格构建 API简单介绍 主要研究功能介绍 快速入门 ParamQuery Grid ...
- spring初始化源码浅析之关键类和扩展接口
目录 1.关键接口和类 1.1.关键类之 DefaultListableBeanFactory 1.2.关键类之XmlBeanDefinitionReader 1.3.关键类之ClassPathXml ...
- java 捕获组与非捕获组
非捕获组:格式:(?:xxxx), 如:(?:aaa)\\w+(bbb)\\1,\\1 代表重复捕获的第一组即是(bbb) public static void main(String[] args) ...
- Python - 面向对象编程 - __call__()
__call()__ 的作用 使得类实例对象可以像普通函数那样被调用 实际栗子 from typing import Callable class PoloBlog: def __init__(sel ...
- windows系统框架
- Node.js躬行记(9)——微前端实践
后台管理系统使用的是umi框架,随着公司业务的发展,目前已经变成了一个巨石应用,越来越难维护,有必要对其进行拆分了. 计划是从市面上挑选一个成熟的微前端框架,首先选择的是 icestark,虽然文档中 ...
- Servlet3.0注解配置访问路径和urlParttern配置
一.Servlet用注解配置访问路径 二.IDEA的tomcat相关配置 其中,第一点的配置文件,直接在IDEA的可视化操作界面修改就可以改掉配置文件中内容: 三.urlParttern配置 其中,* ...
- 下载excel(接收文件流)
/** * 文件流转换 主要代码块,可自定义下载文件名称 * @param {} data */ export function download(data, titName) { if ( ...
- weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394 简介 Oracle官方发布了2021年7月份安全更新通告,通告中披露了WebLogic组件存在高危漏洞,攻击者可以在未授权的情况下通过IIOP.T ...
- J2EE分布式微服务云开发架构 Spring Cloud+Mybatis+ElementUI 前后端分离J2EE分布式微服务云开发架构 Spring Cloud+Mybatis+ElementUI 前后端分离
鸿鹄云架构[系统管理平台]是一个大型企业.分布式.微服务.云架构的JavaEE体系快速研发平台,基于模块化.微服务化.原子化.热部署的设计思想,使用成熟领先的无商业限制的主流开源技术(Spring ...