一本通1664【例 2】取石子游戏 2
取石子游戏 2
题目描述
有一种有趣的游戏,玩法如下:
玩家:2 人;
道具:N 堆石子,每堆石子的数量分别为 X1,X2,...,Xn;
规则:
- 游戏双方轮流取石子;
- 每人每次选一堆石子,并从中取走若干颗石子(至少取 1 颗);
- 所有石子被取完,则游戏结束;
- 如果轮到某人取时已没有石子可取,那此人算负。
假如两个游戏玩家都非常聪明,问谁胜谁负?
输入格式
第一行,一个整数 N;
第二行,N 个空格间隔的整数 Xi,表示每一堆石子的颗数。
输出格式
输出仅一行,一个整数,若先手获胜输出 win
,后手获胜输出 lose
。
样例
样例输入
4
7 12 9 15
样例输出
win
数据范围与提示
对于全部数据,N≤5×104,1≤Xi≤105。
sol:板子,当任意取时SG[x]=x,所以全部异或起来就好了
#include <bits/stdc++.h> using namespace std; typedef int ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)) { s=(s<<3)+(s<<1)+(ch^48); ch=getchar(); } return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) { putchar('-'); x=-x; } if(x<10) { putchar(x+'0'); return; } write(x/10); putchar((x%10)+'0'); return; } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar('\n') int n; int main() { int i,ans=0,x; R(n); for(i=1;i<=n;i++) ans^=(x=read()); if(ans) puts("win"); else puts("lose"); return 0; }
河田は河田、赤木は赤木……。
私は誰ですか。教えてください、私は誰ですか。
そうだ、俺はあきらめない男、三井寿だ!