Manasa和Prime游戏(Hackerrank)

时间:2015-09-21 16:54:47

标签: game-theory

我需要帮助来解决这个问题 -

Manasa喜欢NIM游戏,但是玩了很多次同样的游戏,有一天她感到无聊。所以她想改变游戏规则。由于她喜欢素数,她制定了一条新规则:任何玩家都只能从桶中移除素数球。但是有无限的素数。因此,为了保持游戏简单,玩家只能从桶中移除x个球,其中x属于集合S. S = {2,3,5,7,11,13} 现在整个游戏可以描述如下: 给定N个桶和具有Ak个球的第k个桶,玩家可以选择一个桶并从那个x属于S的桶中移除x个球.Manasa是对Sandy的第一个移动。如果他们两人都达到最佳状态,谁会赢?

2 个答案:

答案 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的分析。