有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。
现在给出初始的两堆石子的数目a和b,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。如果你是胜者,输出Win,否则输出Lose。
例如,a=3,b=1, 则输出Win(你先在a中取一个,此时a=2,b=1,此时无论对方怎么取,你都能将所有石子都拿走)。
其中,所有Loose的情况为(2,1),(5,3),(7,4),(6,10)...,用图形表示为:
因为:
2 - 1 = 1
5 - 3 = 2
7 - 4 = 3
10 - 6 = 4
于是猜测所有Lose的情况为a - b = k(设a > b),k从1一直递增,a,b取值不重复,从1开始。
from __future__ import print_function
def get_failed_pairs(a, b):
c = a if a > b else b
pairs = [0] * (c+1)
k = 1
for i in range(1, c + 1):
if i + k <= c and not pairs[i]:
pairs[i] = pairs[i+k] = i
k += 1
return pairs
def take_the_stone(a, b, pairs):
if a != b and (pairs[a] == pairs[b] != 0):
return False
return True
pairs = get_failed_pairs(a, b)
print(take_the_stone(a, b, pairs) and 'Win' or 'Lose')