石子游戏(nim游戏+按位考虑)
题意
给\(n\)堆石子,每次最多可以从一堆中取\(x\)个,问你\(x = 1 ... n\)时的答案。
解法
经典\(nim\)游戏,找规律知\(sg[i] = i \ mod \ (x+1)\)。
于是便要快速求\(a[1]\ mod\ (x+1) \bigoplus ... a[n]\ mod\ (x+1)\)。
考虑按位做,设\(y = x+1\),对于\(k \leq \frac{n}{y}\),求出\(x \in [ky,(k+1)y)\),求有多少\(x-ky\)有\(2^j\)这一位。
预处理出\(f_{j,i}\)表示对于\(x>=i\),有多少\(x-i\)有\(2^j\)这一位,有
\]
其中\(c_i\)表示\(i\)出现的个数。
考虑统计答案,答案一定是几个\(2^{j+1}\)长度的整块加上一个散块,对于整块,差分即可,对于散块,发现在\([0,2^j-1]\)之间的贡献是\(0\),在\([2^j,2^{j+1}-1]\)之间是\(1\),分\((k+1)y\)在左右半边讨论即可。
code
#include<bits/stdc++.h>
#define ll long long
#define N 500015
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define lowbit(i) ((i)&(-i))
#define VI vector<int>
#define all(x) x.begin(),x.end()
using namespace std;
int c[N],f[21][N];
int n;
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
scanf("%d",&n);
rep(i,1,n){
int u; scanf("%d",&u); c[u] ^= 1;
}
per(i,0,n) c[i] ^= c[i+1];
rep(j,0,18){ // f(j,i) 表示 对于所有x >= i ,x-i有j这一位的异或 是0/1
per(i,0,n){
if((i+(1<<j)) > n) f[j][i] = 0; //x-i 有j这一位 -> x-i > 2^j
else if((i+(1<<(j+1))) > n) f[j][i] = c[i+(1<<j)];
else f[j][i] = f[j][i+(1<<(j+1))]^c[i+(1<<(j+1))]^c[i+(1<<j)]; //
}
}
rep(i,2,n+1){
int top = n/i;//(mod i)
bool ff = 0;
rep(j,0,18){
if((1<<j) >= i) break;
bool now = 0;
rep(k,0,top){
int l = k*i; // [k*i,(k+1)*i)
int r = l+((((i-1)>>(j+1))+1)<<(j+1)); // l ~ i-1向上第一个2^(j+1)的倍数
now ^= f[j][l];
if(r <= n) now ^= f[j][r];
now ^= c[min(max(l+i,r-(1<<j)),n+1)]^c[min(r,n+1)];
}
if(now){ff = 1; break;}
}
if(ff) printf("Alice ");
else printf("Bob ");
}
return 0;
}
石子游戏(nim游戏+按位考虑)的更多相关文章
- hihocoder 1163 博弈游戏·Nim游戏
1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样的 ...
- hiho一下 第四十五周 博弈游戏·Nim游戏·二 [ 博弈 ]
传送门 题目1 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面 ...
- [hihoCoder] 博弈游戏·Nim游戏
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏.在 ...
- 洛谷P2197 nim游戏(Nim游戏)
题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取.每次只能从一堆里 ...
- hihocoder博弈游戏·Nim游戏·三
在这一次游戏中Alice和Bob决定在原来的Nim游戏上增加一条规则:每一次行动时,不仅可以选择一堆取走任意数量的石子(至少取1颗,至多取出这一堆剩下的所有石子),还可以选择将一堆石子分成两堆石子,但 ...
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]
小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问你他是否有必胜策略,如 ...
- hiho一下 第四十五周 博弈游戏·Nim游戏·二(转成NIm)
Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N.现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿 ...
- 【HIHOCODER 1163】 博弈游戏·Nim游戏
描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏. 在这个游戏中,Alice和Bob放置了N堆不同的石子,编号1..N,第 ...
- (2016北京集训十三)【xsy1531】魔法游戏 - Nim游戏
题解: 好题!我的结论很接近正解了... 把一个数化成二进制,每次至少要拿走一位,最多全拿走,不能不拿.那么这就是一个经典的Nim问题了,子树异或起来就是根节点的答案,随便递推一下就行了. 代码: # ...
- hihoCoder hiho一下 第四十六周 博弈游戏·Nim游戏·三( sg函数 )
题意: 给出几堆石子数量,每次可以取走一堆中任意数量的石头,也可以将一堆分成两堆,而不取.最后取走者胜. 思路: 先规矩地计算出sg值,再对每个数量查SG值就可以了.最后求异或和.和不为0的就是必赢. ...
随机推荐
- Lombok注解-@SneakyThrows
@SneakyThrows注解的用途得从java的异常设计体系说起. java中我们常见的2类异常. 1.普通Exception类,也就是我们常说的受检异常或者Checked Exception. 2 ...
- Jquery真的不难~第一回 编程基础知识
Jquery真的不难~第一回 编程基础知识 回到目录 前言 说Jquery之前,先来学习一下Javascript(以后简称为JS)语言中的基础知识问题,其时对于每种编程语言来说基础知识都是大同小异 ...
- 跟我一起学python(1):占位符
模板 格式化字符串时,Python使用一个字符串作为模板.模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式.Python用一个tuple将多个值传递给模板,每个值对应一个格式符 ...
- Hive数据导入Hbase
方案一:Hive关联HBase表方式 适用场景:数据量不大4T以下(走hbase的api导入数据) 一.hbase表不存在的情况 创建hive表hive_hbase_table映射hbase表hbas ...
- java之volatile
一.谈谈对volatile的理解 volatile是java虚拟机提供的轻量级的同步机制 保证可见性.不保证原子性.禁止指令重排 1.可见性理解:所有线程存放都是主内存的副本(比如某个变量值为25), ...
- 日常ie兼容问题(持续整理)
1.关于new Date()格式为何要转成y/m/d格式 IE不会识别时间状态为"y-m-d"的形式,如果获取的new Date("2020-05-01") 那 ...
- pytorch模型结构可视化,可显示每层的尺寸
最近在学习一些检测方面的网络,使用的是pytorch.模型结构可视化是学习网络的有用的部分,pytorch没有原生支持这个功能,需要找一些其他方式,下面总结几种方法(推荐用4). 1. torch . ...
- spring cache 学习 —— @Cacheable 使用详解
1. 功能说明 @Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的.也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方 ...
- 第2章 HTML中的JavaScript
目录 1. script标签 1.1 标签位置 1.2 defer推迟执行脚本 1.3 async异步执行脚本 1.4 动态加载脚本 2. noscript标签 1. script标签 <scr ...
- java进阶(29)--HashMap集合
一.HashMap简介 1.HashMap底层是哈希表结构,类似字典,初始化如下: 2.哈希表结构: 是一个数组+单向链表的结构体 数组:查询效率较高,随机增删效率很低 单向链表:在随机增删方面效率较 ...