正题

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

  1. # [SDOI2019]移动金币 阶梯博弈 dp

    [SDOI移动金币 链接 vijos 思路 阶梯博弈,dp统计. 参见wxyww 代码 #include <bits/stdc++.h> using namespace std; cons ...

  2. Luogu5363 SDOI2019移动金币(博弈+动态规划)

    容易想到可以转化为一个有m堆石子,石子总数不超过n-m的阶梯博弈.阶梯博弈的结论是相当于只考虑奇数层石子的nim游戏. nim和不为0不好算,于是用总方案数减掉nim和为0的方案数.然后考虑dp,按位 ...

  3. Luogu P5363 [SDOI2019]移动金币

    话说这题放在智推里好久了的说,再不写掉对不起自己233 首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客 那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一 ...

  4. HDU 4315 Climbing the Hill (阶梯博弈转尼姆博弈)

    Climbing the Hill Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Su ...

  5. POJ1704 Georgia and Bob (阶梯博弈)

    Georgia and Bob Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Subm ...

  6. HDU 4315:Climbing the Hill(阶梯博弈)

    http://acm.hdu.edu.cn/showproblem.php?pid=4315 题意:有n个人要往坐标为0的地方移动,他们分别有一个位置a[i],其中最靠近0的第k个人是king,移动的 ...

  7. hdu 3389 Game (阶梯博弈)

    #include<stdio.h> int main() { int t,n,ans; int i,j,x; scanf("%d",&t); ;j<=t; ...

  8. HDU 5623 KK's Number (博弈DP)

    KK's Number 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/K Description Our lovely KK h ...

  9. poj 1704 阶梯博弈

    转自http://blog.sina.com.cn/s/blog_63e4cf2f0100tq4i.html 今天在POJ做了一道博弈题..进而了解到了阶梯博弈...下面阐述一下我对于阶梯博弈的理解. ...

随机推荐

  1. rsync基本使用

    概念 rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. 目前,已支持跨平台,可以在Windo ...

  2. Spring-boot注入配置为java静态属性

    配置文件 注入静态变量 注意 类上面有:@Component注解 使用注入的静态变量 成功

  3. Centos7 出现Welcome to emergency mode!【紧急模式】

    Centos7 出现Welcome to emergency mode![紧急模式] 做mount挂载时,修改了  /etc/fstab 文件,导致Centos7重启时出现如下图所示错误:   输入r ...

  4. 剑指 Offer 13. 机器人的运动范围

    剑指 Offer 13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一 ...

  5. 【springcloud】模拟RPC调用(Feign)

    转自:https://blog.csdn.net/pengjunlee/article/details/86615408 Feign简介 Feign是一个声明式的Web Service客户端,它能够让 ...

  6. ffmpeg 常用知识点收集

    ffmpeg 常用知识点收集 一.基础简介 FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影.转换.流功能,包含了libavcodec ─这是一个用于多个项目中音频和视频的解码器库,以及l ...

  7. Maven解决依赖冲突

    依赖冲突 若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的. 短路优先 本项目-->A.jar-->B ...

  8. 如何从 vue-element-admin 迁移到 Fantastic-admin

    // FIXME 链接更新 如果你还不知道 Fantastic-admin 是什么,那么我先用几张预览图给大家了解一番. 看来预览图,如果你感兴趣,可以点这里来详细了解并试用,这是一款完成度极高,开箱 ...

  9. TCP/IP以及Socket聊天室带类库源码分享

    TCP/IP以及Socket聊天室带类库源码分享 最近遇到个设备,需要去和客户的软件做一个网络通信交互,一般的我们的上位机都是作为客户端来和设备通信的,这次要作为服务端来监听客户端,在这个背景下,我查 ...

  10. 存储系统管理(二)——Linux系统的swap分区、磁盘加密、磁盘阵列

    磁盘驱动器上的空间 , 用作当前未使用部分内存的溢出.这样 , 系统就能在主内存中留出空间用于储存当前正在处理的数据 , 并在系统面临主内存空间不足的风险时提供应急溢出. swap分区的建立: fdi ...