[SDOI2019] 移动金币
分析
阶梯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] 移动金币的更多相关文章
- 【洛谷5363】[SDOI2019] 移动金币(动态规划)
点此看题面 大致题意: 有\(n\)个格子,让你摆放\(m\)个金币.二人博弈,每次选择一个金币向左移任意格,无法移动者输.问有多少种方案使先手必胜. 阶梯\(Nim\) 阶梯\(Nim\)的基本模型 ...
- Luogu P5363 [SDOI2019]移动金币
话说这题放在智推里好久了的说,再不写掉对不起自己233 首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客 那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一 ...
- # [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,按位 ...
- [VIJOS2055][SDOI2019]移动金币:DP+组合数学
分析 显然可以转化为阶梯nim. 于是问题转化为了对于所有\(i \in [0,n-m]\),求长度为\(\lfloor\frac{m+1}{2}\rfloor\),和为\(i\),异或和非\(0\) ...
- [SDOI2019]移动金币(博弈论+阶梯Nim+按位DP)
首先可以把问题转化一下:m堆石子,一共石子数不超过(n-m)颗,每次可以将一堆中一些石子推向前一堆,无法操作则失败,问有多少种方法使得先手必胜? 然后这个显然是个阶梯Nim,然后有这样的结论:奇数层异 ...
- 分金币 bzoj 3293
分金币(1s 128M) coin [问题描述] 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的 ...
- Android播放gif动画,增加屏幕掉金币效果
前言:播放gif的版本有很多,我这边使用Android自带的Movie类播放gif动画,也是在别人的基础上进行修改.有同样需求的朋友可以参考我的demo. 1.效果图如下: 2.部分主要代码 Main ...
- noi 1.5 45:金币
描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天)里,每天收到两枚金币:之后三天(第四.五.六天)里,每天收到三枚金币:之后四天(第七.八.九.十天)里, ...
随机推荐
- PAT (Advanced Level) 1035. Password (20)
简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> ...
- topcoder 649 DIV2
8 A:模拟 9:B:终于看懂题目... 题意:最多分解K次 每分钟一个数可以分解成两个数 或者-1: 关键字:DP,记忆花搜索. DP[I][J]=min(dp[i][j],1+max(dp[ii] ...
- JAVA原始的导出excel文件,快捷通用 方便 还能够导出word文档哦
如今导出excel基本上都是用poi了,当报表格式非常负责的时候 开发难度会加大 假设报表有格式有变化 那就更复杂了,先发现一个非常老的技术.能够解决格式复杂的报表. 实例代码例如以下: <%@ ...
- CEF3研究(二)
应用程序结构 每个CEF3应用程序都有一个相同的结构: 提供一个入口函数以初始化CEF和运行每个子进程逻辑和CEF消息处理 提供一个CefApp子类处理某个进程的回调 提供一个CefClinet子类处 ...
- centos7下cp -rf总是提示覆盖的解决办法
发现每次执行cp命令,其实是执行了cp -i命令的别名,因此无论怎么输入都提示是否覆盖. cat ~/.bashrc,有“alias cp='cp -i'”,难怪如此!!! 添加#号,#alias c ...
- freemarker 模板
1 整体结构 模板(FTL 编程)是由例如以下部分混合而成的: Text 文本:文本会照着原样来输出. Interpolation 插值:这部分的输出会被计算的值来替换.插值由${和}所分隔(或者#{ ...
- MySQL基础笔记(二) 完整性约束
我们知道,一种数据模型必须包含三个基本的部分: 构造机制(数据结构):主要描述数据的类型.内容.性质以及数据间的联系等. 运算机制(数据操作):主要描述在相应的数据结构上的操作类型和操作方式. 约束机 ...
- LoadRunner 中调用c函数生成随机字符串
Action() { int itera_num,rand_num,i; ]=""; char StrTable[]="abcdefghijklmnopqrstuvwxy ...
- 谁是性能杀手?Kafka多Topic下启用SSL时延增大问题分析
问题背景 项目中将Kafka接口进行RESTful封装,在使用RESTful接口进行性能测试时,发现Topic数增多后,开启SSL与非SSL进行测试,发现开启SSL后性能下降得厉害.例如600个Top ...
- How to get service execuable path
Some time we need to get specific service path and then do something you want. there are 2 way to ge ...