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做了一道博弈题..进而了解到了阶梯博弈...下面阐述一下我对于阶梯博弈的理解. ...
随机推荐
- MYSQL数据库查询索引
1.查看数据库所有索引 SELECT * FROM mysql.`innodb_index_stats` a WHERE a.`database_name` = '数据库名'; 2.查看某一表索引 S ...
- idea中Jrebe热部署l的安装和激活
安装上这个插件,就不需要再改代码后重复启动服务了,还是很方便的!!! 一.在Idea中,打开File-------->Settings-------->Plugins里面的MarketPl ...
- ThreadPoolExecutor八种拒绝策略浅析
转自:http://www.kailing.pub/article/index/arcid/255.html 前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5 ...
- servlet中servletContext的五大作用(四)
1. 获取web的上下文路径 2. 获取全局的参数 3. 作为域对象使用 4. 请求转发 5. 读取web项目的资源文件 package day10.about_serv ...
- Linux下MySQL主从复制(GTID)+读写分离(ProxySQL)-实施笔记
GTID概念: GTID( Global Transaction Identifier)全局事务标识.GTID 是 5.6 版本引入的一个有关于主从复制的重大改进,相对于之前版本基于 Binlog 文 ...
- promise小案例
页面中有个板块,需要多张图片加载完之后才能进行显示 //页面中有个板块 需要多张图片加载完之后才能进行显示 const loadImg = (src) => { return new Promi ...
- html调用swf的语句
<div style="width: 1000px; height: 202px; margin-left: auto; margin-right: auto"> &l ...
- 记录Mac下使用Charles抓包
抓包 简述 在网络应用如后端系统,app,小程序等的开发过程中,免不了接口可能会报错,但是一般在app中或者小程序中没有便捷的console控制台,而且线上环境也不会开启调试模式,所以想看一下接口的响 ...
- Java特性和优势
Java特性和优势 简单性 面向对象性 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性
- vue 引用省市区三级联动(element-ui select)
npm 下载 axios npm install --save axios static 静态文件夹里 创建 json 文件夹 json 文件夹里创建 map.json map.json 文件里写 ( ...