输入:
3
2 2 3
2 3 4
5 3 4
输出:
Win
Lose
Win
题目大意:给我们一个三角形的三条边x,y,z,每次操作可以把一个边变小,有2个人,每人每次进行一次操作,当通过该操作变小一条边之后,如果不能使得剩下的三条边构成一个三角形,那么这个人就输了,Kate先手,问最后Kate能不能赢。
解题思路:如果r=(x-1)^(y-1)^(z-1)!=0则先手必胜,如果等于0则先手必败。证明如下:
我们假设x,y,z,三条边分别为最短,次短和最长的三条边,因为可以构成三角形所以有x+y>z,进而有(x-1)+(y-1)>=z-1
当r=0时:
·x=1,令y=z,此时x已经不能变小了,只能变y或z,但是一旦两者之中任何一个变小,就不能构成三角形了。
·x>1,假设我们变化x为x',那么x-1!=x'-1,所以(x'-1)^(y-1)^(z-1)!=0,这就转化到了r!=0的情况了。
当r!=0时:
下面三个不等式至少会有一个成立:(x-1)^r<x-1,(y-1)^r<y-1,(z-1)^r<z-1,为什么呢?r中每一位的1一定是由奇数次的1异或起来的,我们假设r中最高位的1是由y-1提供的,那么(y-1)^r最高位的1两两异或是0,一定比原来的y-1小,所以现在的r=r*r=0,又变回了r=0的状态。
综上所述,当r=0是,面临该局面的人 必败,r!=0时,面临该局面的人必胜,证明完毕。
上代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int x,y,z;
cin>>x>>y>>z;
if(((x-1)^(y-1)^(z-1))!=0)
cout<<"Win"<<endl;
else
cout<<"Lose"<<endl;
}
return 0;
}