分析

阶梯NIM模型:共有m+1堆石子,石子总数不超过n-m,求必胜的,即奇数堆石子数目异或和非零的局面数。补集转化,答案C(n,m)-奇数堆石子数目异或和位0的局面数。

可以想到按位dp,设f[i,j]表示已经考虑了前i位(异或和0),石子和为j的方案数;转移时考虑下一位出现的被统计1的个数k,k为偶数,带系数C((m+1)/2,k),即m+1/2个奇数堆中出现k个1的方案。

最后将没有分配的n-m-i个石子放入m/2个偶数堆中,可以一个都不放。

实现

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int N=2e5+10;
const int mod=1e9+9; int n,m;
ll fc[N],fv[N],f[20][N]; inline ll c(int n,int m) {
return fc[n]*fv[m]%mod*fv[n-m]%mod;
} int main() {
scanf("%d%d",&n,&m);
fc[0]=fc[1]=fv[0]=fv[1]=1;
for(int i=2; i<=n+m; ++i) fv[i]=fv[mod%i]*(mod-mod/i)%mod;
for(int i=2; i<=n+m; ++i) fv[i]=fv[i-1]*fv[i]%mod,fc[i]=fc[i-1]*i%mod;
f[19][0]=1;
for(int i=19; i; --i)
for(int j=0; j<=n-m; ++j) if(f[i][j])
for(int k=0; k<=(m+1)/2&&j+(k<<(i-1))<=n-m; k+=2)
(f[i-1][j+(k<<(i-1))]+=f[i][j]*c((m+1)/2,k)%mod)%=mod;
int ans=c(n,m);
for(int i=0; i<=n-m; ++i) ans=(ans-f[0][i]*c(n-m-i+m/2,m/2)+mod)%mod;
printf("%d\n",ans);
return 0;
}

暴力

#include <bits/stdc++.h>
#include <typeinfo>
#define ll long long
using namespace std; const int N=255;
const int M=55;
const int mod=1e9+9; int n,m,T;
int f[M][N][N<<2];
inline void add(int&x,int y) {
if((x+=y)>=mod) x-=mod;
} int main() {
scanf("%d%d",&n,&m);
for(T=1; T<n; T<<=1);
f[0][0][0]=1;
for(int j=0; j<m; ++j) {
int(&F)[N][N<<2]=f[j+1];
int(&G)[N][N<<2]=f[j];
if(j&1) {
for(int i=j; i<=n; ++i)
for(int p=0; p<T; ++p) if(G[i][p])
for(int k=i+1; k<=n; ++k)
add(F[k][p],G[i][p]);
}
else {
for(int i=j; i<=n; ++i)
for(int p=0; p<T; ++p) if(G[i][p])
for(int k=i+1; k<=n; ++k)
add(F[k][p^(k-i-1)],G[i][p]);
}
}
int ans=0;
for(int i=m; i<=n; ++i)
for(int p=1; p<T; ++p)
add(ans,f[m][i][p]);
printf("%d\n",ans);
return 0;
}

[SDOI2019] 移动金币的更多相关文章

  1. 【洛谷5363】[SDOI2019] 移动金币(动态规划)

    点此看题面 大致题意: 有\(n\)个格子,让你摆放\(m\)个金币.二人博弈,每次选择一个金币向左移任意格,无法移动者输.问有多少种方案使先手必胜. 阶梯\(Nim\) 阶梯\(Nim\)的基本模型 ...

  2. Luogu P5363 [SDOI2019]移动金币

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

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

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

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

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

  5. [VIJOS2055][SDOI2019]移动金币:DP+组合数学

    分析 显然可以转化为阶梯nim. 于是问题转化为了对于所有\(i \in [0,n-m]\),求长度为\(\lfloor\frac{m+1}{2}\rfloor\),和为\(i\),异或和非\(0\) ...

  6. [SDOI2019]移动金币(博弈论+阶梯Nim+按位DP)

    首先可以把问题转化一下:m堆石子,一共石子数不超过(n-m)颗,每次可以将一堆中一些石子推向前一堆,无法操作则失败,问有多少种方法使得先手必胜? 然后这个显然是个阶梯Nim,然后有这样的结论:奇数层异 ...

  7. 分金币 bzoj 3293

    分金币(1s 128M)  coin [问题描述] 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的 ...

  8. Android播放gif动画,增加屏幕掉金币效果

    前言:播放gif的版本有很多,我这边使用Android自带的Movie类播放gif动画,也是在别人的基础上进行修改.有同样需求的朋友可以参考我的demo. 1.效果图如下: 2.部分主要代码 Main ...

  9. noi 1.5 45:金币

    描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天)里,每天收到两枚金币:之后三天(第四.五.六天)里,每天收到三枚金币:之后四天(第七.八.九.十天)里, ...

随机推荐

  1. 【Java源码】集合类-ArrayList

    一.类继承关系 public class ArrayList<E> extends AbstractList<E> implements List<E>, Rand ...

  2. Nginx配置upstream实现负载均衡及keepalived实现nginx高可用

    (原文链接:http://www.studyshare.cn/blog-front//blog/details/1159/0 ) 一.准备工作 1.准备两个项目,发布到不同的服务器上,此处使用2个虚拟 ...

  3. Meteor教程

    Meteor 是一个构建在 Node.js 之上的平台,用来开发实时网页程序.Meteor 程序位于数据库和用户界面之间,保持二者之间的数据同步更新. 因为 Meteor 是基于 Node.js 开发 ...

  4. delphi 的结构体对齐关键字

    Align fields (Delphi)   Go Up to Delphi Compiler Directives (List) Index Type Switch Syntax {$A+}, { ...

  5. [转]JavaEE开发基础

    JavaEE开发基础 1 JavaEE简介 Java平台有三个版本,分别是JavaSE(Java Platform, Standard Edition),JavaEE(Java Platform, E ...

  6. C# Json反序列化 数据协定类型 无法反序列化 由于未找到必需的数据成员

    背景今天在使用:C# Json 序列化与反序列化 反序列化的时候出现了以下的错误信息. System.Runtime.Serialization.SerializationException: 数据协 ...

  7. 微信小程序实战之 pay(支付页面)

    项目目录: 逻辑层: pay.js // pages/pay/pay.js Page({ /** * 页面的初始数据 */ data: { resultType: "", resu ...

  8. activiti自己定义流程之自己定义表单(二):创建表单

    注:环境配置:activiti自己定义流程之自己定义表单(一):环境配置 在上一节自己定义表单环境搭建好以后,我就正式開始尝试自己创建表单,在后台的处理就比較常规,主要是针对ueditor插件的功能在 ...

  9. HDU4763 Theme Section 【KMP】

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  10. [故障处理]西部数据wd elements xp 无法识别

    百度后,看到如下帖子,供需要的朋友参考,黑体字为本人修改添加: http://blog.sina.com.cn/s/blog_539747670102w62w.html 经咨询WD厂商(厂商电话800 ...