题目描述

有一个长度为N的数组,甲乙两人在上面进行这样一个游戏:首先,数组上有一些格子是白的,有一些是黑的。然
后两人轮流进行操作。每次操作选择一个白色的格子,假设它的下标为x。接着,选择一个大小在1~n/x之间的整数
k,然后将下标为x、2x、...、kx的格子都进行颜色翻转。不能操作的人输。现在甲(先手)有一些询问。每次他
会给你一个数组的初始状态,你要求出对于这种初始状态他是否有必胜策略。
 

输入格式

接下来2*K行,每两行表示一次询问。在这两行中,第一行一个正整数W,表示数组中有多少个格子是白色的,第二
行则有W个1~N之间的正整数,表示白色格子的对应下标。

输出格式

对于每个询问,若先手必胜输出"Yes",否则输出"No"。答案之间用换行隔开


数据范围

N<=1000000000 , K,W<=100 , 不会有格子在同
一次询问中多次出现。

  • 题解

    • 可以发现变颜色这类问题是符合分解理论的,求出所有位置的sg值异或得到游戏的sg值;
    • 考虑所有位置的sg值如何求;
    • 可以写出一个$O(n^2)$的暴力(注意终止状态的$sg$为0);
    • 考虑改进暴力,打表发现对于一个$n$的所有$i$,$\frac{n}{i}$相同的位置sg值也相同;
    • 将$n$下底分块,就只需要求出$\sqrt{n}$个块的sg函数;
    • 由于是异或,只需要判断在某个块里的奇偶性就可以知道经过这个块的异或值;
    • 同时sg值由于是$mex$所以没有很大,$i<=sqrt(n)$的直接存,$i>sqrt{n}$的存在$\frac{n}{i}$里面:
    • 时间复杂度:$O(n)$ ?, 空间复杂度:$O(\sqrt{n})$;
 #include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n,m,u,a[N],b[N],tot,vis[N],q[N];
void pre(){
for(int i=tot,tmp;i;--i){
tmp=;
int x = q[i];
for(int j=x*,lst;j<=n;j=lst+x){
lst=n/(n/j)/x*x;
int t=lst<=u?a[lst]:b[n/lst];
vis[tmp^t]=i;
if(((lst-j)/x+)&)tmp^=t;
}
for(int j=;;++j)if(vis[j]!=i){tmp=j;break;}
if(x<=u)a[x]=tmp;else b[n/x]=tmp;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj4035.in","r",stdin);
freopen("bzoj4035.out","w",stdout);
#endif
scanf("%d%d",&n,&m);u=sqrt(n);
for(int i=,lst;i<=n;i=lst+){lst=n/(n/i);q[++tot]=lst;}
pre();
for(int i=,x,tmp;i<=m;++i){
scanf("%d",&x);tmp=;
for(int j=,y;j<=x;++j){
scanf("%d",&y);
y=n/(n/y);
tmp^= y<=u?a[y]:b[n/y];
}
puts(tmp?"Yes":"No");
}
return ;
}

bzoj4035

 #include<bits/stdc++.h>
using namespace std;
const int N=;
int n,vis[N],sg[N];
int main(){
// freopen("exp.in","r",stdin);
freopen("exp.out","w",stdout);
for(n=;n<=;++n){
for(int i=;i<=n;++i)sg[i]=;
for(int i=n;i;--i){
for(int j=;j<=n/i;++j)vis[j]=;
int tmp = ;
for(int j=i+i;j<=n;j+=i){
tmp ^= sg[j];
vis[tmp]=;
}
for(int j=;j<=n/i;j++)if(!vis[j]){sg[i]=j;break;}
}
//for(int i=1;i<=100-n+1;++i)putchar(' ');
//for(int i=1;i<=n;++i)putchar(' ');
for(int i=;i<=n;++i)printf("%d ",sg[i]);
//printf("%d ",sg[n-2]);
//for(int i=3;i<=n;i+=3)printf("%d ",sg[i]);
puts("");
}
/*
int now = 20, cnt=0;
for(int i=now,j;i;i=j,now>>=1){
j = i - ((now + 1)>>1);
for(int k=i;k>j;--k)printf("%d",sg[k]),cnt++;
puts("");
}
cout<<cnt<<endl;
*/
return ;
}

暴力

bzoj4035【HAOI2015】数组游戏的更多相关文章

  1. bzoj4035 [HAOI2015]数组游戏

    这题显然把每个白格子看成一个子游戏 一个白格子$x$的$sg$值是$mex{[0,sg[2x],sg[2x] XOR sg[3x].....]}$ 打表发现一个数的$sg$值只和$n/x$有关,然后分 ...

  2. 【BZOJ4035】数组游戏(博弈论)

    [BZOJ4035]数组游戏(博弈论) 题面 BZOJ 洛谷 题解 很明显是一个翻硬币游戏的变形,因此当前局面的\(SG\)函数值就是所有白格子单独存在的\(SG\)函数的异或和. 那么,对于每一个位 ...

  3. 【BZOJ 4035】 4035: [HAOI2015]数组游戏 (博弈)

    4035: [HAOI2015]数组游戏 Time Limit: 15 Sec  Memory Limit: 32 MBSubmit: 181  Solved: 89 Description 有一个长 ...

  4. @bzoj - 4035@ [HAOI2015]数组游戏

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一个长度为N的数组,甲乙两人在上面进行这样一个游戏: 首先,数 ...

  5. [HAOI2015]数组游戏

    题目大意: 有一排n个格子,每个格子上都有一个白子或黑子,在上面进行游戏,规则如下: 选择一个含白子的格子x,并选择一个数k,翻转x,2x,...,kx格子上的子. 不能操作者负. 思路: 将“某个格 ...

  6. 【LOJ】#2126. 「HAOI2015」数组游戏

    题解 简单分析一下就知道\(\lfloor \frac{N}{i} \rfloor\)相同的\(i\)的\(sg\)函数相同 所以我们只要算\(\sqrt{n}\)个\(sg\)函数就好 算每一个\( ...

  7. JZYZOJ1540 BZOJ4035 [ haoi2015 上午] T3 博弈论 sg函数 分块 haoi

    http://172.20.6.3/Problem_Show.asp?id=1540 之前莫比乌斯反演也写了一道这种找规律分块计算的题,没觉得这么恶心啊. 具体解释看代码. 翻硬币的具体方法就是分别算 ...

  8. 最浅谈的SG函数

    [更新] Nim游戏的经验: 每次最多取m个——%(m+1) 阶梯nim——奇数位无视,看偶数位互相独立,成一堆一堆的石子 . . . . 既然被征召去汇总算法..那么挑个简单点的SG函数好了.. 介 ...

  9. sg函数小结

    sg函数小结 sg函数是处理博弈问题的重要工具. 我们知道sg(x)=mex{sg(j)|x能到达状态j} sg(x)=0时代表后手赢,否则先手赢. 对于一个问题,如果某些子问题是相互独立的,我们就可 ...

随机推荐

  1. Hyperledger Fabric 1.0 从零开始(一)

    在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后1.0就发布了.自从2017年7月H ...

  2. Leetcode_3. Find the longest substring without repeating characters

    3. Find the longest substring without repeating characters Given a string, find the length of the lo ...

  3. Apache 性能配置优化

    前言 最近在进行apache性能优化设置.在修改apache配置)文件之前需要备份原有的配置文件夹conf,这是网站架设的好习惯.以下的apache配置调优均是在red had的环境下进行的. htt ...

  4. Python基础_异常处理与跟踪

    异常的种类 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError 无法引入模块或 ...

  5. iOS学习资源搜集

    swift 2.0 新的开始 iOS7初学者入门 斯坦福大学公开课:iOS 8开发 苹果官方开发 中文 iOS/Mac 开发博客列表    git

  6. Scapy之ARP询问

    引言 校园网中,有同学遭受永恒之蓝攻击,但是被杀毒软件查下,并知道了攻击者的ip也是校园网.所以我想看一下,这个ip是PC,还是路由器. 在ip视角,路由器和pc没什么差别. 实现 首先是构造arp报 ...

  7. Week-4-作业1

    前言 经过了上周作业的学习拾遗,让我学到了很多东西,也能更好的阅读<构建之法>这本书,下面是我在阅读过第四章和第十七章之后想到的一些问题. 第四章 4.2.1 关于缩进,书中说用四个空格刚 ...

  8. Xcode7~8版本过渡导致的问题

    现有项目是早期Xcode7编写的,一直到现在还是使用Xcode7编写.近期一位用户手机下载App出现闪退现象,该用户手机系统(iPhone 6 iOS8.1.2)经查实是由于CoreFoundatio ...

  9. vSphere Client 连接ESXi 或者是vCenter 时虚拟机提示VMRC异常的解决办法

    1. 自己的vSphere 连接vCenter 向管理虚拟机 结果发现总是有异常. 提示如图示 VMRC控制台的连接已经断开 2. 花了比较长的时间也没搞定. 后来百度发现 关闭一个进程 然后重新登录 ...

  10. CF271D_Good Substrings

    给一个原串,以及那些字符是坏的,现在问你可以从原串中取出多少个不同子串,使得其所含的坏字符的个数不超过一个定数. 这个题目网上有各种各样的解法.如hash,tire. 我说一下我的解法. 解法一:后缀 ...