分析:
感觉自己的博弈是从零学起
大多数博弈问题都可以先找找规律
n=2−9
n
=
2
−
9
先手可以一步达到目标,先手必胜
n=10−18
n
=
10
−
18
先手第一次是不可能使p超过9的,然而最坏情况下得到2,后手选择9就可以达到18
后手必胜
n=19−162
n
=
19
−
162
先手选9,后手即使选择2得到18,先手至少能得到36,最大得到162
先手必胜
n=163−324
n
=
163
−
324
因为必胜态是对称的,那么后手也有和先手一样大小的必胜态范围
后手必胜
以此类推
我们可以推出先手的必败区间:
[2k∗9k+1+1,2k+1∗9k+1]
[
2
k
∗
9
k
+
1
+
1
,
2
k
+
1
∗
9
k
+
1
]
那么我们只要对于给出的n判断在哪个区间内即可
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
ll n;
int main()
{
while (scanf("%lld",&n)!=EOF)
{
ll now=1;
while (n>now) now*=18;
now/=2;
if (now>=n) printf("Stan wins.\n");
else printf("Ollie wins.\n");
}
return 0;
}