题目:https://vjudge.z180.cn/contest/423164#problem/A
题意:给a,b俩个数,每次只能让大的那个数减去小的那个数的倍数,谁先让某个数减完谁应,问先手必赢还是必输,二者都是选最优情况。
题解:
首先令a>b;
1.如果a%b=0,那么先手一定赢;
2.如果a>=2b,假设a%b=1,那么先手令a=a%b+b,转必输情况为必赢情况,即如果a=a%b,是必赢情况,那么就这么减,如果是必输情况,那么就a=a%b+b,转化一下,所以先手一定必赢。
3.b<a<2b,这个时候只能a=a-b,所以这里要循环判断一下,代码如下:
#include <iostream>
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
ll a, b;
scanf("%lld%lld", &a, &b);
if (a < b)swap(a, b);
if (a % b == 0 || a >= 2 * b) //必赢情况
{
printf("win\n");
return 0;
}
int s = 0;
while (b != 1)
{
ll t = b;
b = a - b, a = t; //没有其他减法,只能这么减
s++;
if (a % b == 0 || a >= 2 * b) //判断谁输谁赢
{
if (s % 2 == 1)printf("lose\n");
else printf("win\n");
return 0;
}
}
return 0;
}