nyoj 135 取石子(二) 【NIM】
取石子(二)
时间限制: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表示小王必定会败。
- 例子输入
-
2 1 1000 1 2 1 1 1 1
- 例子输出
-
Lose Lose
- 提示
- 注意以下一组測试数据
2
1 1
2 2
正确的结果应该是Win
由于小王会先从第二堆石子中取一个石子,使状态变为
1 1
1 2
这样的状态下,不管对方怎么取,小王都能获胜。
nim博弈+巴什
代码:
/* nim */ #include <stdio.h> int 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; }