题目大意:
  有n堆石子,A和B两人轮流进行操作:
  取走任意一堆石子,若这堆石子的个数是x个,那么可以放入x-1堆数量为0~x-1的石子。
  不能操作者负。

思路:
  将每一堆石子作为一个子游戏,将石子的数量作为游戏状态。
  sg(x)=mex{sg(y)|y为x的后继状态}
  然而后继状态有很多,暴力构造肯定会超时。
  考虑找规律。
  sg(0)=0 sg(1)=1 sg(2)=2 sg(3)=4 sg(4)=8 ...
  发现sg(x)=2^(x-1)。
  为什么?
  当x=0时,无法进行操作,显然为必败状态;
  当x=1时,sg(x)=mex{sg(0)};
  当x=2时,sg(x)=mex{sg(0),sg(1)};
  当x=3时,sg(x)=mex{sg(0),sg(1),sg(2),sg(1 1),sg(2 2),sg(1 2)},其中sg(1 2)=3;
  ……
  发现2^0,2^1,...,2^k-1的数能异或出小于2^k的所有数。
  然而x<=1e9,2^x-1似乎要高精度?
  事实上我们发现每个SG值只有1位是1,其余位都是0,
  那么我们可以用一个set记录出现过的位,异或的时候只需要把有的去掉,没的加进来就可以了,由于n<=1e5,显然存得下。

 #include<cstdio>
#include<cctype>
#include<ext/hash_set>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
__gnu_cxx::hash_set<int> sg;
int main() {
for(register int T=getint();T;T--) {
sg.clear();
for(register int n=getint();n;n--) {
const int x=getint()-;
if(sg.count(x)) {
sg.erase(x);
} else {
sg.insert(x);
}
}
puts(sg.empty()?"B":"A");
}
return ;
}

最新文章

  1. AngularJS 过滤器
  2. MongoDB基本管理命令
  3. canvas判断边距,反弹和拖拽的综合实例
  4. RDIFramework.NET ━ 9.10 岗位(职位)管理 ━ Web部分
  5. iOS开发零基础--Swift篇:Swift中数据类型
  6. POJ 2965 The Pilots Brothers&#39; refrigerator 暴力 难度:1
  7. DDL、DML、
  8. 关闭IE窗口
  9. UVA Mapping the Swaps
  10. windows7 &#39;telnet&#39;不是内部或外部命令--转载
  11. sql获取表字段名、描述和类型
  12. Oracle_建表
  13. javascript DOM编程艺术(检测与性能优化)
  14. SQL Server 2012安装step by step
  15. JVM 运行时数据区详解
  16. 将实体转换为Hashtable
  17. Java学习---程序设计_面试题[2]
  18. 基于vue2.0的后管系统(配置篇)
  19. POJ-3436:ACM Computer Factory (Dinic最大流)
  20. hdu 4055 Number String (基础dp)

热门文章

  1. 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享
  2. python基础之内置异常对象
  3. Linux中fork()函数的底层实现【转】
  4. PXC加入新节点避免SST时grastate.dat文件内容的修改问题
  5. 用Centos7搭建小微企业Samba文件共享服务器【转】
  6. python从2.6.x升级到2.7.x
  7. Tutorial 5: Relationships &amp; Hyperlinked APIs
  8. Mybatis的初步使用
  9. hdu 5895(矩阵快速幂+欧拉函数)
  10. PyCharm中 ImportError: No module named tensorflow