如果n在[2, 9]区间,那么Stan胜。
如果n在[10, 18]区间,那么Ollie胜,因为不管第一次Stan乘上多少,第二次Ollie乘上一个9,必然会得到一个不小于18的数。
如果n在[19, 162]这个区间呢?
比如说n=19,那么Stan乘上个2,不管Ollie怎么乘,Ollie得到的数必然在[4, 18]这个区间里面,而这里的任意一个数乘上9的话,必然会得到一个不小于19的数,Stan胜。
再比如n=162,Stan最开始乘上一个9,就将Ollie乘完以后的数限制在[18, 81]这个区间里边,而这里的任何一个数乘上9,必然会得到一个不小于162的数,Stan胜。
所以[19, 162]是Stan的必胜区间。
为了更方便理解,再举两个例子:
n=163的时候,不管第一步Stan乘的是多少,Ollie总可以将第二次得到的数限制在[10, 18]这个范围内,那么Stan乘完以后的数在[20, 162]这个范围,最后Ollie乘上个9就赢了。
n=324的时候,Ollie总可以将第二次得到的数限制在[18, 35],这样Stan操作完得到的数就在[36, 315],最后Ollie乘上个9就赢了。
说了这么多就是说,我们每次要想办法限制对手下一次操作以后的区间,使得区间左边界不能太小,否则下一步自己就不能到达终止状态;右边界也不能太大,否则对手会到达终止状态。
总结一下规律就是[2, 9]是先手必胜,[10, 18]后手必胜,[19, 162]先手必胜,[163, 324]后手必胜。
1 #include <cstdio> 2 3 int main() 4 { 5 double n; 6 while(scanf("%lf", &n) == 1) 7 { 8 while(n > 18) n /= 18; 9 printf("%s\n", n > 9 ? "Ollie wins." : "Stan wins."); 10 } 11 12 return 0; 13 }
代码君
时间: 2024-10-12 08:18:01