我需要帮助来解决这个问题 -
Manasa喜欢NIM游戏,但是玩了很多次同样的游戏,有一天她感到无聊。所以她想改变游戏规则。由于她喜欢素数,她制定了一条新规则:任何玩家都只能从桶中移除素数球。但是有无限的素数。因此,为了保持游戏简单,玩家只能从桶中移除x个球,其中x属于集合S. S = {2,3,5,7,11,13} 现在整个游戏可以描述如下: 给定N个桶和具有Ak个球的第k个桶,玩家可以选择一个桶并从那个x属于S的桶中移除x个球.Manasa是对Sandy的第一个移动。如果他们两人都达到最佳状态,谁会赢?
答案 0 :(得分:0)
以下代码完美地解决了这个问题:
from itertools import imap
import operator
def mapg(N, A):
return 0 != reduce(operator.xor, (a%9//2 for a in A), 0)
for _ in xrange(input()):
N = input()
A = map(int, raw_input().split())
print "Manasa" if mapg(N, A) else "Sandy"
答案 1 :(得分:0)
java解决方案:
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
int t = ni();
for(int i=0; i<t; i++){
System.out.println(solve());
}
}
public static int[] values = new int[]{0, 0, 1, 1, 2, 2, 3, 3, 4};
public static String solve(){
int n = ni();
long ak;
long nimber = 0; //or grundy number
for(int i=0; i<n; i++){
ak = nl();
nimber ^= values[(int) (ak % values.length)];
}
if(nimber > 0) return "Manasa";
return "Sandy";
}
public static Scanner sc = new Scanner(System.in);
public static int ni(){
return sc.nextInt();
}
public static long nl(){
return sc.nextLong();
}
}
来自this blog的分析。