题目详情 甲乙两人面对若干堆石子,其中每一堆石子的数目可以任意确定。 两人轮流按下列规则取走一些石子,游戏的规则如下: 1.每一步应取走至少一枚石子; 2.每一步只能从某一堆中取走部分或全部石子; 3.如果谁无法按规则取子,谁就是输家。 如果甲乙两人都采取最优的策略,甲先拿,请问,是甲必胜还是乙必胜. 输入格式: 多组数据,每组数据两行,第一行是两个整数N和m, 2<=N<=10000 1<=m<=10000。, 下一行是N个正整数,代表每堆的石子数,石子数在32位整数内。 输出格式: 每组测试数据输出一行,如果甲存在必胜策略,输出"Win",否则输出"Lost" 答题说明 输入样例 2 3 4 4 输出样例: Lost 思路:m是干啥的?不知道我的理解能力差还是题目没说清楚,最后就按照各种理解写代码然后提交,最后终于 过了。 就是每次要在某堆石头里面取1到m个。那么这道题就是比较水的了(前提是你已经看了相关的sg函数介 绍),这道题对应的sg函数就是sg(x) = x % (m + 1), 代码如下: #include <iostream> #include <climits> #include <cmath> #include <algorithm> #include <iomanip> #include <vector> #define inf 0x7fffffff #define MOD 1000000007 using namespace std; unsigned int m, n; int main() { while(scanf("%d%d", &n, &m)!=EOF) { int i; unsigned int res = 0; for(i=0; i!=n; i++) { unsigned num; scanf("%d", &num); res ^= num%(m+1); } if(res == 0) printf("Lost\n"); else printf("Win\n"); } return 0; }