正题

题目链接: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. 深入浅出Mybatis系列(七)---TypeHandler简介

    无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型.Mybatis默认 ...

  2. Java程序设计学习笔记(五) — 多线程

    时间:2016-4-15 09:56 --多线程(还有多核编程)     1.进程         进程是一个正在执行中的程序.         每一个进程执行都有一个执行顺序,该顺序是一个执行路径, ...

  3. MongoDB - 文档之间的关系 + _sort和投影

    1. 文档对象之间的关系 一对一 (one TO one) - 例如: 夫妻 (一个丈夫 对应 一个妻子) - 在MongoDB中, 可以通过内嵌文档的形式来体现出一对一的关系 演示: 首先在 my_ ...

  4. SpringCloud升级之路2020.0.x版-24.测试Spring Cloud LoadBalancer

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 通过单元测试,我们 ...

  5. 记一次 .NET 某流媒体独角兽 API 句柄泄漏分析

    一:背景 1. 讲故事 上上周有位朋友找到我,说他的程序CPU和句柄都在不断的增长,无回头趋势,查了好些天也没什么进展,特加wx寻求帮助,截图如下: 看的出来这位朋友也是非常郁闷,出问题还出两个,气人 ...

  6. Go测试--子测试

    目录 简介 简单的例子 子测试命名规则 过滤筛选 子测试并发 总结 简介 简单的说,子测试提供一种在一个测试函数中执行多个测试的能力,比如原来有TestA.TestB和TestC三个测试函数,每个测试 ...

  7. vue3.0入门(二)

    前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 指令 #id2{ // css部分 font-size: 24px; color: green; } v-bind:href=&qu ...

  8. 关于通用Mapper new Example使用记录

    关于通用MapperExample使用记录 环境准备 需要集成 mybatis 的 generator 插件,方便自动生成 实体类和 mapper 类,还可以生成xml,不过一般我们都不用 xml b ...

  9. python 实用技巧:几十行代码将照片转换成素描图、随后打包成可执行文件(源码分享)

    效果展示 原始效果图 素描效果图 相关依赖包 # 超美观的打印库 from pprint import pprint # 图像处理库 from PIL import Image # 科学计算库 imp ...

  10. Jetpack Compose之隐藏Scaffold的BottomNavigation

    做主页导航时会用到底部导航栏,Jetpack Compose提供了基础槽位的布局Scaffold,使用Scaffold可以构建底部导航栏,例如: @Composable fun Greeting(vm ...