#4173. 取火柴游戏

取火柴游戏

当前没有测试数据。

问题描述

输入 kk 个整数 n1, n2, ..., nk,表示有 k 堆火柴棒,第 i 堆火柴棒的根数为 ni。接着便是和计算机对弈游戏,取火柴的规则如下:每次可以从一堆中取走若干根火柴,也可以将一堆全部取走,但不允许跨堆取,也不允许不取。

谁取走最后一根火柴算谁胜利。

例如,k=2n1=n2=2A 代表你,P 代表计算机,若决定 A 先取:

  • A:(2, 2) → (1, 2) // 从一堆中取一根
  • P:(1, 2) → (1, 1) // 从另一堆中取一根
  • A:(1, 1) → (1, 0)
  • P:(1, 0) → (0, 0) // P 胜利

如果决定 A 后取:

  • P:(2, 2) → (2, 0)
  • A:(2, 0) → (0, 0) // A 胜利

又如 k=3n1=1n2=2n3=3A 决定后取:

  • P:(1, 2, 3) → (0, 2, 3)
  • A:(0, 2, 3) → (0, 2, 2)

A 已将游戏归结为(2, 2)的情况,不管 P 如何取,A 都必胜。

输入格式

  • 第一行输入一个整数 k,表示堆数。
  • 第二行输入 k 个整数 n1, n2, ..., nk,表示每堆火柴棒的数量。

输出格式

  • 输出一个字符串或一组数字:
    • 如果存在必胜的策略,输出 第 1 次从第 i 堆取 x 个出来必胜,并给出每次取火柴后的状态。
    • 如果先取必败,输出 lose

输入样例

样例 1

3
3 6 9

样例 2

4
15 22 19 10

输出样例

样例 1

4 3
3 6 5

样例 2

lose

时间复杂度

  • 每次递归检查所有的火柴堆和可能的取数,时间复杂度是 O(k * max(ni)),其中 k 是堆数,max(ni) 是堆中最多的火柴数。

测试样例

输入 1

3
3 6 9

输出 1

4 3
3 6 5

输入 2

4
15 22 19 10

输出 2

lose