Nim or not Nim?

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 613    Accepted Submission(s): 282

Problem Description
Nim is a two-player mathematic game of strategy in which players take turns removing objects from distinct heaps. On each turn, a player must remove at least one object, and may remove any number of objects provided they all come from the same heap.

Nim is usually played as a misere game, in which the player to take the last object loses. Nim can also be played as a normal play game, which means that the person who makes the last move (i.e., who takes the last object) wins. This is called normal play because most games follow this convention, even though Nim usually does not.

Alice and Bob is tired of playing Nim under the standard rule, so they make a difference by also allowing the player to separate one of the heaps into two smaller ones. That is, each turn the player may either remove any number of objects from a heap or separate a heap into two smaller ones, and the one who takes the last object wins.

 
Input
Input contains multiple test cases. The first line is an integer 1 ≤ T ≤ 100, the number of test cases. Each case begins with an integer N, indicating the number of the heaps, the next line contains N integers s[0], s[1], ...., s[N-1], representing heaps with s[0], s[1], ..., s[N-1] objects respectively.(1 ≤ N ≤ 10^6, 1 ≤ S[i] ≤ 2^31 - 1)
 
Output
For each test case, output a line which contains either "Alice" or "Bob", which is the winner of this game. Alice will play first. You may asume they never make mistakes.
 
Sample Input
2
3
2 2 3
2
3 3
 
Sample Output
Alice
Bob
 
Source
 
Recommend
gaojie
 

通过SG函数打表可以发现规律。

当n=4*k时,sg[n] = n-1;

当n= 4*k+3 时,sg[n] = n+1;

其余sg[n] = n;

#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;
const int MAXN = ;
int SG(int x)
{
if(x == )return x;
if(x % == )return x-;
if(x % == )return x+;
return x;
}
int main()
{
int T;
int n,a;
int sum;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
sum = ;
for(int i = ;i < n;i++)
{
scanf("%d",&a);
sum ^= SG(a);
}
if(sum == )printf("Bob\n");
else printf("Alice\n");
}
return ;
}

最新文章

  1. rpm---linux软件安装与管理
  2. Iphone连接win10电脑正常, itunes无法识别解决
  3. 安装beautifulsoup4
  4. vagrant系列教程(四):vagrant搭建redis与redis的监控程序redis-stat(转)
  5. iOS 9.2新增API
  6. mysql新建用户本地无法登录
  7. JAVA虚拟机内存分配与回收机制
  8. Learning JavaScript Design Patterns The Constructor Pattern
  9. php中对MYSQL操作之批量运行,与获取批量结果
  10. 浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
  11. 计蒜客NOIP模拟赛(3)D2T1 小区划分
  12. HNOI2019:My Dream
  13. zTree动态初始化树形结构加载
  14. 大数据 - hadoop三台linux虚拟服务器 - 初始化部署
  15. P1140 相似基因 最长公共子序列
  16. 【转】机器学习在B2B的应用
  17. 移位运算符:&lt;&lt;,&gt;&gt;,&gt;&gt;&gt;总结
  18. IIS性能优化篇
  19. SpringMVC源码阅读:异常解析器
  20. php输出mysqli查询出来的结果

热门文章

  1. codeforces 111D
  2. python实现多个文件的分发
  3. 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂
  4. 文本区 JTextArea 的使用
  5. CentOS 7 主机加固手册-中
  6. Java坦克大战 (二) 之画一个能动的圆圈代表坦克
  7. PHPExcel 使用(1)
  8. js面向对象编程(一):封装(转载)
  9. 消除Git diff中^M的差异
  10. Navigator与UserAgent笔记