[博弈]ZOJ3591 Nim
题意:
给了一串数,个数不超过$10^5$,这串数是通过题目给的一段代码来生成的
int g = S;
for (int i=; i<N; i++) {
a[i] = g;
if( a[i] == ) { a[i] = g = W; }
if( g% == ) { g = (g/); }
else { g = (g/) ^ W; }
}
其中S、N、W都是输入的。
问:从中取连续的一段出来玩Nim博弈,先手赢的取法有多少种。
Nim博弈的结论:每堆异或,最后结果为0的先手输,否则,先手赢;
于是这道题就变成了取连续的一段,异或值不为0的取法数。
N最大有1e5,显然需要O(n)复杂度的方法
异或没什么感觉...如果这道题问的是 取连续的一段,和为X的取法有多少种
那么就很自然的能想到前缀和 第i到第j的总和为sum[j]-sum[i-1]
那联想到这道题,能不能求个前缀异或呢?
对!
而且异或能分为 0 与 非0 两种情况
那么在查询 第i到第j 这一段的异或值时,只需要比较 xor_sum[i] 与 xor_sum[j]
假设xor_sum[i]=X; xor_sum[j]=X;
那么很显然i+1到j的这一段为0 ( X xor 0 = X)
我们只需要记录有多少段为0,用总的n*(n+1)/2去减去就是答案了;
为什么要记录有多少段为0?记录有多少段为0?
我们已经有前缀异或,那么当第二次出现某一值时,这个值 前一次出现的位置 到 本次出现的位置 之间这一段 就是异或值为0的。
因此我们统计异或值为0的要方便的多。
做法就是记录所有的xor_sum出现的次数加起来就好了嘛
int a[];
map<LL, LL> mp;
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, s, w;
scanf("%d%d%d", &n, &s, &w);
int g = s;
for (int i=; i<n; i++)
{
a[i] = g;
if( a[i] == )
a[i] = g = w;
if( g% == )
g = (g/);
else
g = (g/) ^ w;
}
LL xor_sum=, ans=;
mp.clear();
mp[]=;
for(int i=;i<n;i++)
{
xor_sum^=a[i];
ans+=mp[xor_sum];
mp[xor_sum]++;
}
print((LL)n*(n+)/-ans);
}
return ;
}
ZOJ 3591
[博弈]ZOJ3591 Nim的更多相关文章
- hihocoder 1163 博弈游戏·Nim游戏
1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样的 ...
- hiho一下 第四十五周 博弈游戏·Nim游戏·二 [ 博弈 ]
传送门 题目1 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面 ...
- zoj3591 Nim(Nim博弈)
ZOJ 3591 Nim(Nim博弈) 题目意思是说有n堆石子,Alice只能从中选出连续的几堆来玩Nim博弈,现在问Alice想要获胜有多少种方法(即有多少种选择方式). 方法是这样的,由于Nim博 ...
- [hihoCoder] 博弈游戏·Nim游戏
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏.在 ...
- HDU 3032 (Nim博弈变形) Nim or not Nim?
博弈的题目,打表找规律还是相当有用的一个技巧. 这个游戏在原始的Nim游戏基础上又新加了一个操作,就是游戏者可以将一堆分成两堆. 这个SG函数值是多少并不明显,还是用记忆化搜索的方式打个表,规律就相当 ...
- 一种斐波那契博弈(Fibonacci Nim)
事实上我也不知道这算是哪个类型的博弈 是在复习$NOIP$初赛的时候看到的一个挺有趣的博弈 所以就写出来分享一下 $upd \ on \ 2018.10.12$忽然发现这个其实就是$Fibonacci ...
- Nim博弈(nim游戏)
http://blog.csdn.net/qiankun1993/article/details/6765688 NIM 游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P- ...
- hihocoder博弈游戏·Nim游戏·三
在这一次游戏中Alice和Bob决定在原来的Nim游戏上增加一条规则:每一次行动时,不仅可以选择一堆取走任意数量的石子(至少取1颗,至多取出这一堆剩下的所有石子),还可以选择将一堆石子分成两堆石子,但 ...
- POJ 3480 John [博弈之Nim 与 Anti-Nim]
Nim游戏:有n堆石子,每堆个数不一,两人依次捡石子,每次只能从一堆中至少捡一个.捡走最后一个石子胜. 先手胜负:将所有堆的石子数进行异或(xor),最后值为0则先手输,否则先手胜. ======== ...
随机推荐
- c#winform音乐制作软件
C#音乐播放器 这个音乐播放器是winform 功能有:(括号中是值得提高的部分) 1:登陆提示(查询数据库) 2:皮肤换肤的功能(能右键或者通过按键就能实现) 3:图片的轮换(图片的地址从数据库中抽 ...
- Shared library can't open object
将cpp的源文件和.so (shared object)链接成可执行程序之后,无法运行,提示如标题,实际就是找不到共享库. 最终找到了解决办法是: export LD_LIBRARY=./:$LD_L ...
- 基于TLS的反调试技术
TLS(Thread Local Storage 线程局部存储) 一个进程中的每个线程在访问同一个线程局部存储时,访问到的都是独立的绑定于该线程的数据块.在PEB(进程环境块)中TLS存储槽共64个( ...
- Java多线程(三) 多线程间的基本通信
多条线程在操作同一份数据的时候,一般需要程序去控制好变量.在多条线程同时运行的前提下控制变量,涉及到线程通信及变量保护等. 本博文主要总结:①线程是如何通信 ②如何保护线程变量 1.Java里的线程 ...
- 在Mac OS X中使用VIM开发STM32(4)
本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 在上三篇文章中,我们基本搭建好了开发STM32的IDE环境,当然vim.ctags.tagl ...
- 基础学习总结(三)--文本、SD卡数据读写
简单的文本数据写入文件不需要权限,读写SD卡在4.0版本前需要写权限.在4.0后需要读写权限 布局: <LinearLayout xmlns:android="http://schem ...
- [转]SET NOCOUNT ON
ref: http://www.cnblogs.com/jayleke/archive/2010/07/10/1774758.html 在存储过程,触发器中,经常用到SET NOCOUNT ON: 作 ...
- 【原】隐藏ultraGrid1指定列
void uGrdAllFlight_InitializeRow(object sender, InitializeRowEventArgs e) { /***********TEST START** ...
- 《PHP与MySQL WEB开发》读书笔记
<PHP与MySQL WEB开发>读书笔记 作者:[美]Luke Welling PHP输出的HereDoc语法: echo <<<theEnd line 1 line ...
- Kakfa揭秘 Day1 Kafka原理内幕
Spark Streaming揭秘 Day32 Kafka原理内幕 今天开始,会有几天的时间,和大家研究下Kafka.在大数据处理体系中,kafka的重要性不亚于SparkStreaming.可以认为 ...