题意:开始的时候p=1,2个人轮流对p进行操作,每次操作中,他们可以选择把p乘上一个数,这个数的范围是2-9。现在的问题是,给你一个n,两人轮流操作,谁先把p操作到p>=n谁就获胜,两人都采用最优策略,问谁获胜。
根据给定的n,可以找出一些必胜、必败的区间。不如说给出的n是162,那么必败的区间是[18,161],必胜的区间是[9,17]。显然先手一次就可以把p的值直接变成9,所以先手可以获胜。然后去递推这些区间就行了,直到递推到区间左边的值为小于10的数。然后判断一下这个区间是必胜的还是必败的区间,被谁取到就可以了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 long long int x; 7 while(cin>>x){ 8 int cnt = 0,tmp; 9 while(x >= 10){ 10 cnt++; 11 if(cnt&1) tmp = 9; 12 else tmp = 2; 13 int t = x % tmp; 14 x /= tmp; 15 if(t) x++; 16 //cout<<"x="<<x<<endl; 17 } 18 if(cnt%2 == 0 || (cnt%2 == 1 && x >= 3)) cout<<"Stan wins. "; 19 else cout<<"Ollie wins. "; 20 } 21 return 0; 22 }