博弈问题-Alice与Bob拿牌游戏

Description

Bob and Alice play a game, and Bob will play first.

Here is the rule of the game:

1) There are N stones at first;

2) Bob and Alice take turns to remove stones. Each time, they can remove p^k stones. p is prime number, such as 2, 3, 5, ..., and k is an non-negative integer.

3) The one who removes the last stone wins the game.

You have to tell Bob, if both Alice and Bob play perfectly, who will win the game.

Input

The first line of the input is a positive integer T (1<T<=10000). T is the number of the test case followed.

Each test case contains one line with an integer N (1<N<1000000) which is the number of the stones at the beginning.

Output

The output of each test case only contains the name of the winner: "Bob" or "Alice". No any redundant spaces is needed.

Sample Input

 Copy sample input to clipboard

2
5
6

Sample Output

Bob
Alice

大体意思就是Alice和Bob玩游戏,有n个牌,每人每次只能拿一个质数的幂次个,Bob先来,然后轮流拿,然后拿走最后一根的就赢,给定一个数n,判断在最佳策略下谁赢。

这个问题看起来有些复杂,其实只要从最简单情况出发,进行推导就可以得出答案,具体步骤如下:

1.显然可知,当n=1,2,3,4,5是Bob赢,当n=6时Alice赢,在这里把6称作”坏数“,因为谁拿它谁输;

2.那么当n=6+1,2,3,4,5=7,8,9,10,11时也是Bob赢,因为此时Bob只要再分别拿1,2,3,4,5张就可以使剩下的变为6,将6这个坏数抛给Alice,使Alice输;而当n=6+6=12时却做不到,因为此时最小唯一的小于12的“坏数”是6,而Bob却显然无法拿6(坏数)张牌。

3.当n=12+1,2,3,4,5=13,14,15,16,17时,也是Bob赢,因为Bob只要再分别拿1,2,3,4,5张就可以把12这个“坏数”抛给Alice(之前已经推导出,12是一个”坏数“(谁拿谁输));当n=12+6=18时,Bob便无法拿12张,6张(坏数张),使得剩下为6,12而将坏数抛给Alice,一旦做不到这样,他就只能抛给Alice一个“好数”,在这之后Alice或者直接拿完剩下的牌,如果不行的话也可以产生一个坏数扔给Bob,无论怎样Bob都会输。

其实在这里还有一点,怎么证明Alice如果不能直接拿完剩下的牌,也一定可以产生一个坏数扔给Bob而使Bob输呢?因为从之前6,12,18可以看出1-18中,只有“坏数”不能产生减去质数的幂个从而产生坏数(所以才会输),“好数”是一定可以产生坏数的(所以才赢),当n>18时一样可证(后文有数学归纳法证明)。

4.相信到这里你已经看出来了,n=18+1,2,3,4,5=19,20,21,22,23时,同样是“好数”,Bob会赢,n=18+6时无法产生坏数,Bob又要输,直到这里,我们已经可以看出,6的倍数都为坏数,且坏数都为6的倍数就算你不信,我们至少可以手算出6,12这两个坏数是6的倍数,那么由数学归纳法,假设n=6m,当m<=k时已证6的倍数是坏数且坏数是6的倍数,那么当m=k+1,时,要证n为一好数(即推翻我的结论),便要让此时的n=6(k+1)减掉一个好数变为坏数,由之前假设得,由于之前坏数都为6的倍数,那么它只能减掉6的倍数才能产生6的倍数(因为他本身是6的倍数),而之前假设同样已证6的倍数是坏数,因而它是不能减的,得证。(说的有些啰嗦,请海涵)

到这里我们已经可以得出结论来了,if(n%6),Bob赢,else  Alice赢(真是个令人难过的结论)。

总结:1.其实从以上推导可以看出,所有的数被分到两个集合:A(好数)和B(坏数),A集合的数满足以下特性:可以一次拿走或可以拿走一些后产生B集合的数;B集合的数具有以下特性:不可能一次拿走而且拿走一些数只能产生A集合的数而不能产生B集合的数(嵌套了,有些难理解)。只要这样,如果Bob一开始拿到B数,起码这回合不会马上赢,而且必须给Alice一个A数,而Alice得到A数就算不能一次拿光,可以再产生一个B数抛回来,这样Bob又没法赢,Alice可以一直持续这样做使Bob一直没法赢,直到Alice得到一个可以一次拿光的A数Alice就赢!如果Bob一开始得到一个A数就可以按Alice的做法故技重施直到自己赢,这就是经由以上归纳分析得出的最佳策略!

2.其实多看几道博弈问题就会发现,最优策略就是让对方“不得不做”,而我方却始终可以让对方陷入“不得不做”的境地 ,这样就会赢!进一步归纳,博弈问题一般的局面形势可分为两种:“不得不做”的形势,可以让对方陷入“不得不做”的形势的形势,只要玩家找到这两种形式的分界(这是最难的也是核心所在),就可在游戏开局可以看出自己处于那一种形势,从而立于不败之地!

3.笔者刚看到这道题的时候,老是把重点放在Bob先拿上,即使知道Bob怎样做才合适,然而觉得Alice的行为具有不确定性,因而感觉太难,不会做,但正如以上所说,博弈问题的最优策略便是消除对方行为的不确定性,使对方不得不做;此外老是纠结于“质数次幂”,结果质数次幂完全没用上,反而从1,2,3,4,5,6这几个最基本的数便可推导出结论!

4.从这道题可以看出,博弈问题的双方遵守同一个规则,因而他们是想着同一个方向努力,因而不必纠结于谁先谁后,也不必纠结于两个玩家,只看一个玩家即可,有时甚至不要太纠结于规则(比如题目中的质数次幂),如果不知道怎样做自己才必然赢的话,那么可以换个角度,只要想方设法让对方输即可,如果仍感觉无从下手,可以先从最简单的开始,然后推导,归纳或许就会有新发现!

(第一次写博客,有些啰嗦,请海涵)

时间: 2024-10-12 16:57:21

博弈问题-Alice与Bob拿牌游戏的相关文章

ACM训练联盟周赛 C题 Alice和Bob的Nim游戏

题目描述 众所周知,Alice和Bob非常喜欢博弈,而且Alice永远是先手,Bob永远是后手. Alice和Bob面前有3堆石子,Alice和Bob每次轮流拿某堆石子中的若干个石子(不可以是0个),拿到所有石子中最后一个石子的人获胜.这是一个只有3堆石子的Nim游戏. Bob错误的认为,三堆石子的Nim游戏只需要少的两堆的石子数量加起来等于多的那一堆,后手就一定会胜利.所以,Bob把三堆石子的数量分别设为 {k,4k,5k}(k>0). 现在Alice想要知道,在k 小于 2^n 的时候,有多

HDU 4268 Alice and Bob(贪心)

Alice and Bob                                                                Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Alice and Bob's game never ends. Today, they introduce a new game. I

ZOJ 3529 A Game Between Alice and Bob (分解质因数+Nim博弈)

A Game Between Alice and Bob Time Limit: 5 Seconds      Memory Limit: 262144 KB 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

HDU 4111 Alice and Bob (博弈)

Alice and Bob Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1799    Accepted Submission(s): 650 Problem Description Alice and Bob are very smart guys and they like to play all kinds of games i

ZOJ 3666 Alice and Bob (SG博弈)

题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3666 题意: 给一个有向图,然后A和B轮流移动棋子,棋子在每一个位置可以重叠,当某人不能走时,输! 问A和B谁赢 方法: 显然每一局游戏都是独立的,对每一局游戏异或即可 每一局游戏的结果可以用SG求,记忆化搜索之 1 int dfs(int x) 2 { 3 if (sg[x] != -1) return sg[x]; 4 bool vis[maxn]; 5 me

XTU 1209 Alice and Bob (博弈)

Alice and Bob Accepted : 174   Submit : 342 Time Limit : 1000 MS   Memory Limit : 65536 KB Problem Description The famous "Alice and Bob" are playing a game again. So now comes the new problem which need a person smart as you to decide the winne

UVA 1500 - Alice and Bob(博弈)

UVA 1500 - Alice and Bob 题目链接 题意:alice和bob这对狗男女play a game,黑板上有n个数字,每次能把一个数字减1,或者把两个数字合成一个数字,值为两数的和,数字减到0就自动被擦去,最后不能操作的算输,alice先手,问最后谁赢 思路:博弈问题,首先想到一点就很好办了,就是对于非1的所有数,肯定会优先去合并成一个数字的,因为如果当前状态能胜,我优先合并掉,对手不管做什么都无法阻止.然后利用必胜态必败态去进行dp,dp[i][j]记录是有i个1,在非1的堆

博弈 HDOJ 4371 Alice and Bob

题目传送门 题意:Alice和 Bob轮流写数字,假设第 i 次的数字是S[i] ,那么第 i+1 次的数字 S[i+1] = S[i] + d[k] 或 S[i] - d[k],条件是 S[i+1] <= n && S[i-1]<S[i+1] 分析:设d[]最小的数字为mn,除此之外设为d,第一次A写了0,第二次B如果写了d,那么A可以写d - mn,确保自己有数直到胜利:如果B第一次写了mn,那么以后的数都只能加mn直到>n,这个很好判断谁胜利. 收获:博弈题想到了就

ACdream 1112 Alice and Bob(素筛+博弈SG函数)

Alice and Bob Time Limit:3000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit Status Practice ACdream 1112 Description Here  is Alice and Bob again ! Alice and Bob are playing a game. There are several numbers. First, Alice choose