题意&分析:
Stan和Ollie玩乘法游戏,从p=1开始,两人均可以将当前p乘上一个数k(2 <= k <= 9),谁先使p大于等于目标数n,那么获胜。stan是先手,两人都按照最佳策略走。
博弈问题,想了很久,不妨从目标数逆推回去,举个例子,n=162,那么使得自己的p处在 [18,161],是绝对会输的,,而区间 [9,17]就是安全的区间,你的对手会跑到前面那个必定输的区间,再向前,就是p=1了,通过逆推哦嘛=我们得到三个区间(最后p=1姑且算一个)。所以区间数是奇数是,先手的Stan获胜,偶数是Ollie获胜。
代码如下:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define TEST cout<<"stop here"<<endl
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
ll n;
while(cin>>n){
ll step = 0;
while(n>1){
if(++step%2)
n = (n-1)/9 + 1;
else
n = (n+1)/2;
}
if(step%2)
cout<< "Stan wins." <<endl;
else
cout<< "Ollie wins." <<endl;
}
return 0;
}