HDU-2897 邂逅明下
开头很文艺的一段说明, 2333。
题解:布什博弈的变形, 谁最后一次取谁输。如果留下了[1,p]的石子个数那么接下来取的那个人就一定输了。
现在要求的是新手赢, n%(p+q) > p 的话, 先手可以将余数从>p, 取成 小于一个p的值, 然后这个人对于剩下的石子来讲就是后手了, 然后根据布什博弈的道理, 控制区间, 然后留下 小于p的那个值就好了。
如果n % (p+q) == 0 那么先手取最大的情况就好了, 就如同样例 6 2 4 先手取4, 后手必须要把2都拿走, 后手就输了。
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define ULL unsigned LL 5 #define fi first 6 #define se second 7 #define lson l,m,rt<<1 8 #define rson m+1,r,rt<<1|1 9 #define max3(a,b,c) max(a,max(b,c)) 10 const int INF = 0x3f3f3f3f; 11 const LL mod = 1e9+7; 12 typedef pair<int,int> pll; 13 int n, p, q; 14 int main(){ 15 while(~scanf("%d%d%d", &n, &p, &q)){ 16 if(n%(p+q) == 0 || n%(p+q) > p) puts("WIN"); 17 else puts("LOST"); 18 } 19 return 0; 20 }