分析:
一开始我直接记搜
但是题目中连数据范围都没给,铁定RE
实际上这道题我们还是要分情况讨论一下:
设
(x,y)
(
x
,
y
)
中
x>y
x
>
y
-
x−y<y
x
−
y
<
y
,这种情况下只能从
x
x
中减去一个
如果 (y,x−y) ( y , x − y ) 是必败态,那么 (x,y) ( x , y ) 就是必胜态 -
x−y>y
x
−
y
>
y
,这种情况下可以从
x
x
中减去多个
设一共可以减去 k k 个y,那么我们先取个 y y ,得到新状态:,此时就回到了第一种情况
- 如果 (x−(k−1)y,y) ( x − ( k − 1 ) y , y ) 是必败态,那么 (x,y) ( x , y ) 就是必胜态
- 如果状态
(x−(k−1)y,y)
(
x
−
(
k
−
1
)
y
,
y
)
为必胜态的话,那么
(x−ky,y)
(
x
−
k
y
,
y
)
肯定是必败态
所以先手可以直接减去 k k 倍的,得到必败态,那么 (x,y) ( x , y ) 即为必胜态
这样我们就可以直接暴力模拟了(而且可行状态减少了很多)
考虑一下终止状态:
x=y
x
=
y
:必胜态
x−y>y
x
−
y
>
y
:必胜态
x(mod)y=0
x
(
m
o
d
)
y
=
0
:必胜态
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;
int main()
{
while (scanf("%d%d",&n,&m)!=EOF&&n+m)
{
if (n<m) swap(n,m);
bool p=1;
while (m!=0)
{
if (n%m==0||n-m>m) break;
n-=m;
p=!p;
if (n<m) swap(n,m);
}
if (p) printf("Stan wins\n");
else printf("Ollie wins\n");
}
return 0;
}