题目描述
新一和柯南在玩一个乘法游戏。简单地说,新一总是从p=1开始,将p乘以一个数字
r
(
2
<
=
r
<
=
9
)
r(2<=r<=9)
r(2<=r<=9),然后柯南继续乘以一个新的数字
r
(
2
<
=
r
<
=
9
)
r(2<=r<=9)
r(2<=r<=9)。
哪一方得到的乘积率先大于等于
n
(
1
<
n
<
4294967295
)
n(1 < n < 4294967295)
n(1<n<4294967295)就获胜。
输入输出格式
输入格式:
输入多个样例,每个样例只有一行包含一个整数n。
输出格式:
对于每个样例,如果新一获胜,输出:“Stan wins.”;如果柯南获胜,输出“Ollie wins.”。
注意,作为名侦探新一和柯南都是足够聪明的。
输入输出样例
输入样例#1:
162
17
34012226
输出样例#1:
Stan wins.
Ollie wins.
Stan wins.
我们知道必胜态和必败态满足下面的关系:
必败态的后继都是必胜态。
必胜态的后继必存在必败态(注意是存在)
我们的目的就是看1到底是在必败态里面还是在必胜态里面,必胜态满足以下特征:
[ n / 9 / 2 / 9 / 2 / … … / 9 , n / 9 / 2 / 9 / 2 / … … / 9 / 2 ) , [ n / 9 / 2 / 9 / 2 /……/ 9, n / 9 / 2 / 9 / 2 /……/ 9 /2), [n/9/2/9/2/……/9,n/9/2/9/2/……/9/2),左区间以除 9 9 9结尾。我们不难发现左区间的值相当于 n n n一直除 18 18 18直到 n n n小于 18 18 18为止,这时候我们要判断 n n n与 9 9 9的关系,若 n n n小于 9 9 9,则除以 9 9 9之后会包含 1 1 1,这时候 1 1 1为必胜态,反之为必败态。
所以我们只需要一直除以 18 18 18就行了
AC代码
#include<bits/stdc++.h>
using namespace std;
int a[100001],b[100001],sum,sum1;
double t;//注意是double
int main(){
while(cin>>t){
while(t>18){
t/=18;
}
if(t>9){
cout<<"Ollie wins."<<endl;
}else{
cout<<"Stan wins."<<endl;
}
}
return 0;
}