题目描述

有一个长度为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. shell之arp命令

    arp: 显示所有的表项. arp -d address: 删除一个arp表项. arp -s address hw_addr: 设置一个arp表项.   常用参数: -a 使用bsd形式输出.(没有 ...

  2. 关于MySql8.X设置允许root远程登陆的问题

    这是最近在mac上使用mysql workbench上遇到的一个小问题,仔细想了想其实这个问题本身就有毛病,论起正式环境来哪家公司是直接使用root去远程登录的呢?恐怕没几个,so不纠结root了创建 ...

  3. UVALive 6467 Strahler Order(拓扑序列)

    In geology, a river system can be represented as a directed graph. Each river segment is an edge; wi ...

  4. 20162328蔡文琛 大二week01

    教材学习内容总结 算法+程序机构=程序 渐进复杂度称为算法的阶. 算法分析是计算机科学的基础课题. 增长函数显示了与问题大小相关的时间或空间的利用率. 算法的阶由算法增长函数的主项决定. 算法的阶给出 ...

  5. 饭来了小组Alpha冲刺阶段记录

    一.第一天 日期:2018/6/13 1.1今日完成任务情况以及遇到的问题 侯晓东: 1.完成任务项:具体了解了微信小程序的开发流程,然后大致规划了我们项目的进度和完成节点:汇总组员的进度,写博客:画 ...

  6. C#代码分析(第三周)

    阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...

  7. My复利计算程序测试报告

    My复利计算程序测试报告 4.0 单元测试----------------------------- 要求: 对我们和复利计算程序,写单元测试. 有哪些场景? 期待的返回值 写测试程序. 运行测试. ...

  8. #Leetcode# 817. Linked List Components

    https://leetcode.com/problems/linked-list-components/ We are given head, the head node of a linked l ...

  9. HDU 2123 An easy problem

    http://acm.hdu.edu.cn/showproblem.php?pid=2123 Problem Description In this problem you need to make ...

  10. 《简明Python教程》学习笔记

    <简明Python教程>是网上比较好的一个Python入门级教程,尽管版本比较老旧,但是其中的基本讲解还是很有实力的. Ch2–安装Python:下载安装完成后,在系统的环境变量里,在Pa ...