ZOJ 3529 A Game Between Alice and Bob(博弈论-sg函数)
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函数)的更多相关文章
- zoj 3529 A Game Between Alice and Bob 博弈论
思路:每个数的SG值就是其质因子个数,在进行nim博弈 代码如下: #include<iostream> #include<cstdio> #include<cmath& ...
- 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 ...
- Zoj 3529 A Game Between Alice and Bob 数论+博弈Nim 快速求数中有多少个素数因子
本题涉及博弈论中的Nim游戏博弈. Nim游戏博弈详解链接: http://www.cnblogs.com/exponent/articles/2141477.html 本题解题报告详解链接: htt ...
- hdu 4111 Alice and Bob 博弈论
这里有2种方法: 方法一:求SG函数 sg[i][j]:i表示1的个数,j表示合并操作的步数. 这共有4种操作: 1.消除一个1: 2.减掉一个1: 3.合并2个1: 4.把1合并到另外不是1中. 代 ...
- ZOJ 3057 Beans Game 博弈论 sg函数
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3057 典型的sg函数,数据范围卡得真好啊 代码 #include<c ...
- ZOJ 3757 Alice and Bob and Cue Sports(模拟)
题目链接 题意 : 玩台球.Alice 和 Bob,一共可以进行m次,Alice 先打.有一个白球和n个标有不同标号的球,称目标球为当前在桌子上的除了白球以外的数值最小的球,默认白球的标号为0.如果白 ...
- 2014 Super Training #6 A Alice and Bob --SG函数
原题: ZOJ 3666 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3666 博弈问题. 题意:给你1~N个位置,N是最 ...
- 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob
Alice and Bob Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- bzoj4730: Alice和Bob又在玩游戏
Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...
随机推荐
- duilib之源码分析
<duilib之源码分析>1 stdAfx.h * lengthof(x) 计算数组长度宏 * MAX 两值最大 * MIN 两值最小 * CLAMP(x,a,b) x在a,b之间则取 ...
- 疯狂JAVA讲义第三章之数组篇
package test; /** * Desription: * @author orangebook *<br/>网站:<a href="http://www.cr ...
- 使用ffmpeg视频编码过程中踩的一个坑
今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果: ...
- 总线接口与计算机通信(三)UART起止式异步通用串行数据总线
串口简介 1. 什么是串口? 串口是计算机上一种非常通用的设备通信的协议.串口通信的概念非常简单,串口按位(bit) 发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送 ...
- 什么是透明(和Windows主题有关系),研究TLable和TPanel是两个好例子
在controls.pas单元里只有判断,没有赋值,所以一直不是很明白.于是在stdCtrls.pas里找了几个例子,直观加深一下印象: constructor TCustomLabel.Create ...
- 从M个数中随机选出N个数的所有组合,有序,(二)
这就是数学中的 A m n 的选取. 共有 m!/n!种可能.. 同样举一个例子吧.. 从12345这五个数字中随机选取3个数字,要求选出来的这三个数字是有序,也就是说从12345中选出来的是12 ...
- PHP环境部署问题集合
Forbidden You don't have permission to access /phpmyadmin/ on this server. 安装wamp 后访问 http://localho ...
- 上一篇括号配对让人联想起catalan数,顺便转载一篇归纳的还不错的文章
转载请注明来自souldak,微博:@evagle 怎么样才是合法的组合? 只要每一时刻保证左括号的数目>=右括号的数目即可. 直接递归就行,每次递归加一个括号,左括号只要还有就能加,右括号要保 ...
- Java面试宝典2014版
一. Java基础部分......................................................................................... ...
- Swift - 程序进入后台,以及应用终止时调用的方法
在AppDelegate中有如下两个方法要注意: applicationDidEnterBackground() 当应用进入后台时起作用 applicationWillTerminate() 当应 ...