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

思路:
  将“某个格子上有一个白子 ”视作游戏的一个状态。
  对于状态x,sg(x)=mex{sg(2x),sg(2x)^sg(3x),sg(2x)^sg(3x)^...^sg(kx)}。
  由于SG函数的取值只与棋盘大小和棋子位置有关,因此我们可以记忆化。
  然后我们就有了暴力构造SG函数的程序,实测只能过40%的点,大力卡常以后勉强能50%。
  而且空间显然也开不下,只能用hash_map。
  然而这题的SG函数有一些神奇的性质,例如,对于大小为10的棋盘,当x分别为1~10时,sg(x)分别为:
  4 1 2 2 2 1 1 1 1 1
  我们将它们进行分组:
  (4)(1)(2)(2 2)(1 1 1 1 1)
  可以发现,当不同棋子可以往后跳的步数相同时,它们的SG函数相同。
  显然可以把它们分为2sqrt(n)组。
  其中前sqrt(n)组都是一个子一组,后sqrt(n)组都是很多个一组。
  这样,以sqrt(n)为界,对于我们需要的函数,判断一下参数的范围即可。

 #include<cmath>
#include<cstdio>
#include<cctype>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
int sg[N][],mex[N];
int n,block;
inline int next(const int &x,const int &y) {
return x==y?x+:y/(y/(x+));
}
void getsg() {
for(register int i=;i<=n;i=next(i,n)) {
for(register int k=,tmp=;k<=i;k=next(k,i)) {
int x=i/k;
int t=(x>block)?sg[n/x][]:sg[x][];
mex[tmp^t]=i;
if((i/x-i/(x+))&) tmp^=t;
}
int tmp=;
while(mex[tmp]==i) tmp++;
((i>block)?sg[n/i][]:sg[i][])=tmp;
}
}
int main() {
n=getint();
block=floor(sqrt(n));
getsg();
for(register int m=getint();m;m--) {
int ans=;
for(register int w=getint();w;w--) {
const int x=getint();
ans^=(n/x>block)?sg[n/(n/x)][]:sg[n/x][];
}
puts(ans?"Yes":"No");
}
return ;
}

暴力构造SG函数的程序:

 #include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<ext/hash_map>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
__gnu_cxx::hash_map<int,int> sg,mex;
int n;
int getsg(const int x) {
if(sg.count(x)) return sg[x];
for(int k=,tmp=;k<=n/x;k++) {
tmp^=getsg(x*k);
mex[tmp]=x;
}
for(sg[x]=;mex[sg[x]]==x;sg[x]++);
return sg[x];
}
int main() {
n=getint();
for(int i=n;i;i--) getsg(i);
for(int m=getint();m;m--) {
int ans=;
for(int w=getint();w;w--) {
ans^=getsg(getint());
}
puts(ans?"Yes":"No");
}
return ;
}

[HAOI2015]数组游戏的更多相关文章

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

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

  2. bzoj4035 [HAOI2015]数组游戏

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

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

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

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

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

  5. bzoj4035【HAOI2015】数组游戏

    题目描述 有一个长度为N的数组,甲乙两人在上面进行这样一个游戏:首先,数组上有一些格子是白的,有一些是黑的.然 后两人轮流进行操作.每次操作选择一个白色的格子,假设它的下标为x.接着,选择一个大小在1 ...

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

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

  7. sg函数小结

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

  8. 最浅谈的SG函数

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

  9. HAOI2015 简要题解

    「HAOI2015」树上染色 题意 有一棵点数为 \(N\) 的树,树边有边权.给你一个在 \(0 \sim N\) 之内的正整数 \(K\),你要在这棵树中选择 \(K\) 个点,将其染成黑色,并将 ...

随机推荐

  1. 从ZoomEye API 到 Weblogic 弱口令扫描

    参考资料: ZoomEye API: https://www.zoomeye.org/api/doc Weblogic-Weakpassword-Scnner: https://github.com/ ...

  2. 64_p4

    perl-Test-Compile-1.3.0-4.fc26.noarch.rpm 12-Feb-2017 05:09 26486 perl-Test-ConsistentVersion-0.3.0- ...

  3. 宝塔Linux面板新手安装教程【转】

    一.使用远程连接软件 (如 Putty.XShell) 连接你的Linux服务器,本教程以 Putty 为例. 1.动 Putty.exe 程序,进入 Putty 主界面. 2.在 Host Name ...

  4. Enumeration的学习

    枚举是jdk5.0之后的新特性.枚举的使用在编程中能起到很大的作用,本文从枚举的适用范围.枚举的特点.枚举的使用等三个方面学习枚举 一.枚举的使适用范围 “在有限的范围内选择值”:比如一个星期只有星期 ...

  5. Tutorial 3: Class-based Views

    转载自:http://www.django-rest-framework.org/tutorial/3-class-based-views/ Tutorial 3: Class-based Views ...

  6. 用dom4j操作xml文件

    XML的全称是eXtensible Markup Language,即“可扩展标记语言”.XML文件的作用主要是数据存储,文件配置,数据传输. html与xml的区别是:①html语法松散,xml语法 ...

  7. Windows 和Linux 误删除后的恢复

    ext文件系统上删除文件,可以恢复:extundelete; windows 恢复删除文件: final data v2.0汉化版 和 easyrecovery

  8. C++随笔(2)

    在牛客网上刷题,遇到的一些需要注意的题 1.这题需要注意的是strcpy复制的时候什么时候停止 2.这题是关于strlen的,它不统计‘\0',但复制的时候仍会复制. 3.这题是写strcpy函数的, ...

  9. IOS - Safari中click点击事件无效

    做web移动端页面时,安卓端一点问题也没,发现在ios真机上点击事件无效,发现Safari下只有默认可点击的元素才click点击事件,像span div等元素是不具有点击事件的. 解决问题四种方式: ...

  10. 反片语(UVa156)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&a ...