ZOJ 3529 - A Game Between Alice and Bob

Time Limit:5000MS     Memory Limit:262144KB     64bit IO Format:%lld
& %llu

Description

Alice and Bob play the following game. A series of numbers is written on the blackboard. Alice and Bob take turns choosing one of the numbers, and replace it with one of its positive factor but not itself. The one who makes the product of all numbers become
1 wins. You can assume Alice and Bob are intelligent enough and Alice take the first turn. The problem comes, who is the winner and which number is Alice's first choice if she wins?

Input

This problem contains multiple test cases. The first line of each case contains only one number N (1<= N <= 100000) representing there are N numbers on the blackboard. The second line contains N integer numbers
specifying the N numbers written on the blackboard. All the numbers are positive and less than or equal to 5000000.

Output

Print exactly one line for each test case. The line begins with "Test #c: ", where c indicates the case number. Then print the name of the winner. If Alice wins, a number indicating her first choice is acquired, print its index after
her name, separated by a space. If more than one number can be her first choice, make the index minimal.

Sample Input

4
5 7 9 12
4
41503 15991 72 16057

Sample Output

Test #1: Alice 1
Test #2: Bob

题目大意:

给定n个数字。两个人轮流玩游戏。把这n个数字变成n的因子(不包括本身),最后全变成1就赢了,问你谁会赢,假设Alice赢了,把第一步选择的那一个数字的序号输出,假设有多种方案,输出序号小的。

解题思路:

sg[1]=0;

sg[2]=mex{sg[1]}=1;

sg[3]=mex{sg[1]}=1;

sg[4]=mex{sg[2],sg[1]}=2;

sg[5]=mex{sg[1]}=1;

sg[6]=mex{sg[2],sg[3]}=2;

sg[7]=mex{sg[1],sg[7]}=1;

sg[8]=mex{sg[1],sg[2],sg[4]}=3;

..........................

发现 sg[x]为 x因子的个数。

证明:由于 假设一个为a, 则:sg[x]=sg[(x/a)*a]=mex{sg[1]....,sg[(x/a)]}=sg[(x/a)]+1;

求出每一个数字的sg后,仅仅须要看sg的异或和,假设==0 和明显,输出Bob

否则。输出Alice,可是要输出Alice先走了哪一步,这里实用到了一个性质:仅仅须要用合并后的SG值与每一堆SG值分别异或,看得到的结果是否小于原来该堆的SG值。假设小则能够取该堆。

这个性质临时不是非常懂,先用上,以后了解了会给出证明和过程。

解题代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std; const int maxn=5000010;
int n,sg[maxn];
int d[110000]; vector <int> prime;
bool isprime[maxn]; void ini(){
isprime[2]=true;
for(int i=3;i<maxn;i+=2) isprime[i]=true;
for(int i=3;i<maxn;i+=2){
for(int j=i;j<maxn/i;j+=2){
isprime[i*j]=false;
}
}
for(int i=2;i<=maxn;i++){
if(isprime[i]) prime.push_back(i);
}
} int SG(int x){
if(sg[x]!=-1) return sg[x];
int ret=0,size=prime.size(),tmp=x;
for(int i=0;i<size && prime[i]*prime[i]<=x;i++){
while(x%prime[i]==0){
x/=prime[i];
ret++;
}
}
if(x>1) ret++;
return sg[tmp]=ret;
} int main(){
ini();
memset(sg,-1,sizeof(sg));
int casen=0;
while(scanf("%d",&n)!=EOF){
int ans=0;
for(int i=0;i<n;i++){
scanf("%d",&d[i]);
ans^=SG(d[i]);
}
if(ans==0) printf("Test #%d: Bob\n",++casen);
else{
for(int i=0;i<n;i++){
if( ( ans^SG(d[i]) ) < SG(d[i]) ){
printf("Test #%d: Alice %d\n",++casen,i+1);
break;
}
}
}
}
return 0;
}

ZOJ 3529 A Game Between Alice and Bob(博弈论-sg函数)的更多相关文章

  1. zoj 3529 A Game Between Alice and Bob 博弈论

    思路:每个数的SG值就是其质因子个数,在进行nim博弈 代码如下: #include<iostream> #include<cstdio> #include<cmath& ...

  2. ZOJ 3529 A Game Between Alice and Bob 博弈好题

    A Game Between Alice and Bob Time Limit: 5 Seconds      Memory Limit: 262144 KB Alice and Bob play t ...

  3. Zoj 3529 A Game Between Alice and Bob 数论+博弈Nim 快速求数中有多少个素数因子

    本题涉及博弈论中的Nim游戏博弈. Nim游戏博弈详解链接: http://www.cnblogs.com/exponent/articles/2141477.html 本题解题报告详解链接: htt ...

  4. hdu 4111 Alice and Bob 博弈论

    这里有2种方法: 方法一:求SG函数 sg[i][j]:i表示1的个数,j表示合并操作的步数. 这共有4种操作: 1.消除一个1: 2.减掉一个1: 3.合并2个1: 4.把1合并到另外不是1中. 代 ...

  5. ZOJ 3057 Beans Game 博弈论 sg函数

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3057 典型的sg函数,数据范围卡得真好啊 代码 #include<c ...

  6. ZOJ 3757 Alice and Bob and Cue Sports(模拟)

    题目链接 题意 : 玩台球.Alice 和 Bob,一共可以进行m次,Alice 先打.有一个白球和n个标有不同标号的球,称目标球为当前在桌子上的除了白球以外的数值最小的球,默认白球的标号为0.如果白 ...

  7. 2014 Super Training #6 A Alice and Bob --SG函数

    原题: ZOJ 3666 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3666 博弈问题. 题意:给你1~N个位置,N是最 ...

  8. 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob

    Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  9. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

随机推荐

  1. 彻底明白Java的IO系统

    java学习:彻底明白Java的IO系统 文章来源:互联网 一. Input和Output1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源.在Java的IO中,所有 ...

  2. solr 从零学习开始

    2010-10 目 录 1 1.1 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.3 1.3.1 1.3.2 1.4 1.4.1 1.4.2 1.4. ...

  3. STL 源代码剖析 算法 stl_algo.h -- equal_range

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie equal_range(应用于有序区间) ------------------------- ...

  4. YT工作日志-0911

    上午 在导师的帮助下,帮我从svn上下载了项目.但是因为项目太大(不算jar包有730M),很多模块不是我工作中涉及的,但是运行的时候会报错,所以导师还帮我找了很多错误.把那些不需要的东西注释了.就这 ...

  5. const对象默认是static的,而不是extern的

    const 和 static 变量,可以放在头文件中 const对象默认是static的,而不是extern的,所以即使放在头文件中声明和定义.多个cpp引用同一个头文件,互相也没有感知,所以不会导致 ...

  6. 使用tmux [FreeBSDChina Wiki]

    使用tmux [FreeBSDChina Wiki] 使用tmux tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权.使用它最直观的好处就是,通过一个 ...

  7. python模块介绍- xlwt 创建xls文件(excel)

    python模块介绍- xlwt 创建xls文件(excel) 2013-06-24磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 ...

  8. iOS 获取当前时间以及计算年龄(时间差)

    获取当前时间 NSDate *now = [NSDate date]; NSLog(@"now date is: %@", now); NSCalendar *calendar = ...

  9. 在SharePoint 2013 中使用文档库Scheduling (计划公布功能)

    本文讲述在SharePoint2013 中使用文档库Scheduling (计划公布功能)的步骤和注意的事项. 文档库Scheduling (计划公布功能) 用于设定当文档通过审批后特定的时间区间内才 ...

  10. Linux设备驱动中的ioctl

    memdev.h #ifndef _MEMDEV_H #define _MEMDEV_H #define MEM_MAGIC 'm' #define MEM_RESTART _IO(MEM_MAGIC ...