题目大意:
  有一排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. TensorFlow下利用MNIST训练模型识别手写数字

    本文将参考TensorFlow中文社区官方文档使用mnist数据集训练一个多层卷积神经网络(LeNet5网络),并利用所训练的模型识别自己手写数字. 训练MNIST数据集,并保存训练模型 # Pyth ...

  2. html中插入其他html,并实现动态效果!

    <html> <body> 倒计时开始...... <span id="s1">888</span> <!--在html中先做 ...

  3. password passphrase passcode 的区别

    In general, passphrases are long passwords and passcodes are numeric-only passwords.

  4. Perl6多线程4: Promise allof / anyof

    allof   : 所有代码块执行完成后才退出 anyof :只要有一个代码块执行完后就马上退出 要配合 await 一起用: my $p = start {say 'a'}; ;say 'b';} ...

  5. Mysql储存过程1: 设置结束符与储存过程创建

    #显示储存过程 show procedure status; #设置结束符 delimiter $; #创建储存过程 create procedure procedure_name() begin - ...

  6. 42、和为S的两个数字

    一.题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 二.解法 import java.util.ArrayLis ...

  7. Redis—初探Redis

    一.什么是Redis? 学习Redis最好的是看官网了,下面是Redis的官网对Redis的介绍 可见,Redis是一个内存存储的数据结构服务器,可以用作数据库.缓存等.支持的数据结构也很丰富,有字符 ...

  8. gpk-update-icon占用CPU及清除【原创】

    发现服务器有个gpk-update-icon一直占用CPU进程 网上查看相关信息比较少. gpk-update-icon是gnome的更新图标进程 俩种处理方法: 1.杀掉gpk-update-ico ...

  9. 混合式App开发 Apicloud 官方iPhone X 适配

    iPhone X 适配 由于iPhone X的特殊造型,为了方便开发者对iPhone X进行适配,苹果在iOS 11中引入了Safe Area的概念,引擎也在api对象下添加了safeArea属性和s ...

  10. 大数据系列之分布式数据库HBase-0.9.8安装及增删改查实践

    若查看HBase-1.2.4版本内容及demo代码详见 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践 1. 环境准备: 1.需要在Hadoop启动正常情况下安 ...