vijos2055 移动金币
思路
首先这是一个阶梯博弈。
我们将金币两两组合,如果对方移动前一个,那么我们把后一个移动相同的距离,局面相当于没有变化。如果对方移动后一个,就相当于\(NIM\)游戏中,取走了一些石子。
所以这个游戏也就是金币两两组合后,有\(\lceil \frac{m}{2}\rceil\) 堆石子,进行\(NIM\)游戏
统计方案
然后考虑如何统计方案。
根据上面的结论。也就是我们要找出\(\lceil \frac{m}{2}\rceil\)堆石子,使他们个数异或和为0。
\(f[i][j]\)表示异或和的前i位异或起来为\(0\),已经有了j个石子的方案数。
就有如下的转移$$f[i][j]=\sum\limits_{k=0}^{2 ^{2k}\le j&k\le \lceil\frac{m}{2}\rceil}{f[i-1][j-2^{2k}]\times (^{\lceil \frac{m}{2} \rceil}_{2k})}$$
然后再考虑这\(\lceil \frac{m}{2} \rceil\)堆石子的位置。
利用隔板法。就相当于把\(\frac{m}{2}\)个挡板插到了长度为\(n-i\)(i为所放的石子长度)的序列里。
代码
/*
* @Author: wxyww
* @Date: 2019-05-11 18:24:32
* @Last Modified time: 2019-05-15 09:49:57
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 150000 + 100,mod = 1e9 + 9;
#define int ll
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int inv[N],f[20][N],jc[N];
int qm(int x,int y) {
int ret = 1;
for(;y;y >>= 1,x = 1ll * x * x % mod)
if(y & 1) ret = 1ll * ret * x % mod;
return ret;
}
int C(int x,int y) {
return 1ll * jc[x] * inv[y] % mod * inv[x - y] % mod;
}
signed main() {
int n = read(),m = read();
//预处理
jc[0] = 1;
for(int i = 1;i <= n + m;++i) jc[i] = 1ll * jc[i - 1] * i % mod;
inv[0] = 1;
for(int i = 1;i <= n + m;++i) inv[i] = qm(jc[i],mod - 2);
int ans = C(n,m);
n -= m;
int num = (m + 1) >> 1;
//dp
f[0][0] = 1;
for(int i = 1;i <= 19;++i) {
int z = i - 1;
for(int j = 0;j <= n;++j) {
for(int k = 0;(k << z) <= j && k <= num;k += 2) {
f[i][j] += 1ll * f[i - 1][j - (k << z)] * C(num,k) % mod;
f[i][j] %= mod;
}
}
}
//统计答案
for(int i = 0;i <= n;++i) {
ans -= 1ll * f[19][i] * C(m / 2 + n - i,m / 2) % mod;
ans = (ans + mod) % mod;
}
cout<<ans;
return 0;
}
vijos2055 移动金币的更多相关文章
- [VIJOS2055][SDOI2019]移动金币:DP+组合数学
分析 显然可以转化为阶梯nim. 于是问题转化为了对于所有\(i \in [0,n-m]\),求长度为\(\lfloor\frac{m+1}{2}\rfloor\),和为\(i\),异或和非\(0\) ...
- 分金币 bzoj 3293
分金币(1s 128M) coin [问题描述] 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的 ...
- Android播放gif动画,增加屏幕掉金币效果
前言:播放gif的版本有很多,我这边使用Android自带的Movie类播放gif动画,也是在别人的基础上进行修改.有同样需求的朋友可以参考我的demo. 1.效果图如下: 2.部分主要代码 Main ...
- noi 1.5 45:金币
描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天)里,每天收到两枚金币:之后三天(第四.五.六天)里,每天收到三枚金币:之后四天(第七.八.九.十天)里, ...
- 清北学堂模拟day4 捡金币
[问题描述]小空正在玩一个叫做捡金币的游戏.游戏在一个被划分成 n行 n列的网格状场地中进行.每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化. 小空的任务就是在网格中移动,拾取尽量多的 ...
- BZOJ3293: [Cqoi2011]分金币
Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Inpu ...
- [ACM_几何] UVA 11300 Spreading the Wealth [分金币 左右给 最终相等 方程组 中位数]
Problem A Communist regime is trying to redistribute wealth in a village. They have have decided to ...
- 网页音乐突破金币(RMB)下载限制
我平时有时间会跳跳舞 跳舞肯定要有音乐呀 于是在网上找音乐 好不容易找到了一个网站,里面有很多很全的音乐 正准备下载呢,尼玛居然要金币! 在这里解释一下,金币你可以通过回复帖子或者发帖子得到,但是数量 ...
- 【BZOJ-3293&1465&1045】分金币&糖果传递×2 中位数 + 乱搞
3293: [Cqoi2011]分金币 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 854 Solved: 476[Submit][Status] ...
随机推荐
- Windows 防火墙无法更改某些设置错误代码 0x80070422
Windows 防火墙无法更改某些设置错误代码 0x80070422 解决方法: 1.cmd ->services.msc 按下回车键打开服务 : 2.在服务界面双击打开[Windows F ...
- ndt算法学习
NDT算法原理: NDT算法的基本思想是先根据参考数据(reference scan)来构建多维变量的正态分布, 如果变换参数能使得两幅激光数据匹配的很好,那么变换点在参考系中的概率密度将会很大. 因 ...
- 1.go语言入门
1.Go语言中文网,选择相应版本(32位或64位)下载 https://studygolang.com/dl, 2.解压到一个任意文件夹 3.配置环境变量 cmd命令行输入go version查看当前 ...
- A Pattern Language for Parallel Application Programming
A Pattern Language for Parallel Application Programming Berna L. Massingill, Timothy G. Mattson, Bev ...
- kali渗透综合靶机(十六)--evilscience靶机
kali渗透综合靶机(十六)--evilscience靶机 一.主机发现 1.netdiscover -i eth0 -r 192.168.10.0/24 二.端口扫描 1. masscan --ra ...
- SAP PI开发手册-ERP发布服务供外部系统调用(sproxy代理类)
转自:https://www.cnblogs.com/fanjb/p/10829858.html 一. 接口内容 接口详细信息 1. 字段对应关系 发送字段对应关系 返回字段对应关系 2. ...
- C 数组、枚举类型enum
传递数组给函数 告诉编译器函数要接受一个指针 skip //函数声明,数组的长度无需声明,因为编译器不会对形式参数进行边界检查 void myFunction(int param[]) //或者 vo ...
- 如何使用Charles让手机访问PC自定义域名?
需求:移动端访问PC上的自定义域名,如在Nginx上配置的域名 如vv.zzcloud.com这个域名在pc上是通过host映射的方式访问,现在需要在手机上访问到这个域名. 工具:Charles代 ...
- 小鸟初学Shell编程(四)管道符
管道作用 管道实际上就是进程之间的一个通信工具,那么用在Linux命令中主要是方便两条命令互相之间可以相互通信. 管道符 管道符(匿名管道)是Shell编程经常用到的通信工具. 管道符是"| ...
- jquery根据下拉框选择的值显示输入框
原理就是根据下拉框选择的值来控制显示那个输入框: html代码: 首先定义一个下拉框,$serviceTypeList就是后台传过来的所有属性, <div class="uk-form ...