了解这个难题的解决方案

时间:2012-11-11 15:46:16

标签: c algorithm puzzle primes

我在编码比赛中正在做一个谜题,而且我一直坚持一个问题。基本上我不明白有人能够达到这个解决方案。这个难题是

Alice和Bob玩下面的游戏。他们选择N号来玩。规则如下:

  1. 鲍勃首先出场,两名球员交替出场。
  2. 在他/她的回合中,玩家可以从N中减去任何小于N的素数(包括1)。这样获得的数字是新的N.
  3. 无法行动的人将失去游戏。
  4. 假设两者都发挥得最佳,谁赢了比赛?

    给定的解决方案是

    int main() {
      long int T, N;
      for(scanf("%ld", &T); T > 0; T--) {
        scanf("%ld", &N);
        if (N % 4 == 1) {
          printf("ALICE wins\n");
        } else {
          printf("BOB wins\n");
        }
    }
    

1 个答案:

答案 0 :(得分:6)

这是一种Nim游戏。最终面临N = 1的玩家输了。如果N % 4 != 1,Bob可以使用1,2或3来制作下一个N ≡ 1 (mod 4),让Alice处于失败位置。否则,如果在开始时N ≡ 1 (mod 4),Alice可以反击Bob的移动,为Bob再次留下≡ 1 (mod 4)号码。