取石子(二)
时间限制: 3000 ms | 内存限制: 65535 KB
难度: 5
- 描写叙述
-
小王喜欢与同事玩一些小游戏。今天他们选择了玩取石子。
游戏规则例如以下:共同拥有N堆石子。已知每堆中石子的数量。而且规定好每堆石子最多能够取的石子数(最少取1颗)。
两个人轮流取子。每次仅仅能选择N堆石子中的一堆,取一定数量的石子(最少取一个),而且取的石子数量不能多于该堆石子规定好的最多取子数。等哪个人无法取子时就表示此人输掉了游戏。
如果每次都是小王先取石子,而且游戏两方都绝对聪明,如今给你石子的堆数、每堆石子的数量和每堆石子规定的单次取子上限,请推断出小王是否能获胜。
- 输入
- 第一行是一个整数T表示測试数据的组数(T<100) 每组測试数据的第一行是一个整数N(1<N<100),表示共同拥有N堆石子,随后的N行每行表示一堆石子。这N行中每行有两个数整数m,n表示该堆石子共同拥有m个石子,该堆石子每次最多取n个。(0<=m,n<=2^31) 输出
- 对于每组測试数据,输出Win表示小王能够获胜,输出Lose表示小王必定会败。 例子输入
-
211000 121 11 1
例子输出 -
LoseLose
提示 - 注意以下一组測试数据 2 1 1 2 2 正确的结果应该是Win 由于小王会先从第二堆石子中取一个石子,使状态变为 1 1 1 2 这样的状态下,不管对方怎么取,小王都能获胜。
nim博弈+巴什
代码:
/*nim*/#includeint main(){ int t, n; scanf("%d", &t); while(t --){ scanf("%d", &n); int ans = 0,a, k; while(n --){ scanf("%d%d", &a, &k); a%=(k+1); ans^=a; } printf("%s\n", ans?
"Win":"Lose"); } return 0; }