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 }
原文地址:https://www.cnblogs.com/MingSD/p/8583446.html