ZOJ - 3591 NIM
ZOJ - 3591NIM
题目大意:给你n,s,w和代码,能生成长度为n的序列,问异或和不为0的子序列有多少个?
这是个挂羊头卖狗肉的题,和NIM博弈的关系就是要异或和不为0,一开始以博弈甚至循环节的去想这题,完全跑偏了。其实主要还是一个异或和,我们看一组数2 3 2 3 2 3 2,我们像前缀和一样去处理
数 2 3 2 3 2 3 3
异或和 2 1 3 0 2 1 2
位置 1 2 3 4 5 6 7
我们可以发现位置1到位置5的异或结果是一样的都是2,这能说明什么呢,说明位置1到位置4的异或结果为0,位置4的异或和就是0,这很明显。再来看位置2到位置6的他们异或结果都是1,为什么呢?因为位置2到位置5的异或结果0,中间的异或结果为0,所以从位置2到位置6的异或结果才会相同。我们来看异或和结果一样的位置1,5,7,可以发现它们异或和相等,然后和位置已经没有太大关系,因为异或和相同,说明两个位置中间的异或结果为0。那每两个相同异或和结果的位置就决定了一个为0的子序列。所以我们只需要排个序,然后统计相同异或和的长度len,然后两两组合就是len*(len-1)/2个序列为0,我们只要用总结果n*(n+1)/2减去这个组合的个数就可以得到答案了,还有就是异或和已经等于0的位置就像上面的位置4,他们相当于从位置0(最初)到当前位置的序列,这也要减去。详情见代码。
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int N=;
ll n,s,w,a[N],sum[N];
void init()
{
ll g=s;
sum[]=;
for (int i=;i<=n;i++)
{
a[i]=g;
sum[i]=sum[i-]^a[i];//前缀异或和
if(a[i]==)
a[i]=g=w;
if(g%==)
g=g/;
else
g=(g/)^w;
}
sum[n+]=-;//为了把最后的也统计上,加上个终止条件
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld",&n,&s,&w);
init();
sort(sum+,sum++n);//把前缀异或和排个序,使相同的在连续区间
ll ans=n*(n+)/;
for(ll i=,j=;i<=n+;i++)
{
if(sum[i]==)//已经是0了减去
ans--;
if(i>&&sum[i]!=sum[i-])//减去中间相同区间的组合
{
ans-=(i-j)*(i-j-)/;
j=i;
}
}
printf("%lld\n",ans);
}
return ;
}
前前后后
这题给了我一个很好的启发,也是在敲板子套模板多了之后给我提了个思考,要变通,要去思考问题。
ZOJ - 3591 NIM的更多相关文章
- zoj 3591 Nim 博弈论
思路:先生成序列再求异或,最多的可能为n*(n+1)/2: 在去掉其中必败的序列,也就是a[i]=a[j]之间的序列. 代码如下: #include<iostream> #include& ...
- ZOJ 3964 NIM变形
LINK 题意:n堆石子,Alice 和 Bob 轮流取石子,谁不能再取或被对方取完为败.但是对于alice拥有限制:b=0此堆正常无限制:b=1此堆Alice只能取奇数个石子:b=2只能取偶数个石子 ...
- zoj3591 Nim(Nim博弈)
ZOJ 3591 Nim(Nim博弈) 题目意思是说有n堆石子,Alice只能从中选出连续的几堆来玩Nim博弈,现在问Alice想要获胜有多少种方法(即有多少种选择方式). 方法是这样的,由于Nim博 ...
- [博弈]ZOJ3591 Nim
题意: 给了一串数,个数不超过$10^5$,这串数是通过题目给的一段代码来生成的 int g = S; ; i<N; i++) { a[i] = g; ) { a[i] = g = W; } = ...
- Zoj 3529 A Game Between Alice and Bob 数论+博弈Nim 快速求数中有多少个素数因子
本题涉及博弈论中的Nim游戏博弈. Nim游戏博弈详解链接: http://www.cnblogs.com/exponent/articles/2141477.html 本题解题报告详解链接: htt ...
- ZOJ 3964 Yet Another Game of Stones Nim游戏变种
ZOJ3964 解题思路 此题的题意比较容易理解,可以简单的看着 Nim 博弈的变种.但问题在于 Alice 对第 i 堆石子的取法必须根据 bi 确定.所以如果这个问题能够归结到正常的 Nim 博弈 ...
- ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...
- [LeetCode] Nim Game 尼姆游戏
You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
随机推荐
- 关于vs code文本编辑器的快捷键
另一篇编辑器Sublime Text下载.使用教程.插件推荐说明.全套快捷键 基础编辑 快捷键 作用 Ctrl+X 剪切 Ctrl+C 复制 Ctrl+Shift+K 删除当前行 Ctrl+Enter ...
- T100——英文版凭证报表
范例:cxrr001 效果:增加英文版报表选择 1.azzi301,复制cxrr001_g01,把样板编号改为cxrr001_g01_01: 2.下载cxrr001_g01的GR样板,把cxrr001 ...
- C# HttpWebRequest向远程地址Post文件
HttpWebRequest向远程地址Post文件 /// <summary> /// 上传文件到远程服务器 /// </summary> /// <param name ...
- window.setInterval
window.clearInterval与window.setInterval的用法 window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setI ...
- Nginx支持WebSocket服务
server{ listen ; access_log logs/.jieyun.top.log main; server_name .jieyun.top; #绑定域名 index index.ph ...
- Typora入门:全网最全教程
目录 简介 Markdown介绍 常用快捷键 块元素 换行符 标题级别 引用文字 无序列表 有序列表 任务列表 代码块 数学表达式 插入表格 脚注 分割线 目录(TOC) 跨度元素 链接 网址 图片 ...
- centos7 zookeeper集群的搭建
说明:该集群的搭建是为了服务于solr集群,请参考我的关于solr集群搭建的博客. 1.创建solr-cloud目录 mkdir /usr/local/solr-cloud 2.将解压的apache- ...
- 通过sql判断时间区间是否存在数据
在做项目的时候遇到过一个问题,用户需要获取当前月或者几个月的数据,但是有一个要求,如果已经存在一张单已经包含了这几个月的数据,那么就不能再提取到重复的数据. 其实这个问题,我做完了我的方式之后才发现, ...
- java_day10_多线程
第十章:线程 1.进程和线程的概述 1)进程和线程定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和 ...
- vim 去掉自动注释和自动回车
取消 :set paste 恢复 :set paste!