题意略。
思路:
我们分别来考虑n取到的各个区间,从而发现其中的规律:
[2,9] 明显 Stan 必胜。
但是当n = 9 + 1时,Stan无论如何也不能取胜,并且此时,假设 Stan 取值 x ,那在[10 , x * 9]这个范围内一定是Ollie必胜。
Stan 一定会贪心地令x = 2,这样可以尽可能减损Ollie的必胜范围,而Ollie会使自己的数字选择成9,这样可以尽可能扩大自己的必胜范围。
所以:[10,18 = 2 * 9] Ollie 必胜
当n = 18 + 1时,Ollie无论如何也没有办法取胜了,这是他也会采取和 Stan 同样的贪心操作,通过令自己选择的所有数字取2来减损接下来 Stan 的必胜范围。
而Stan一定会使自己的所有数字选9来扩大自己的必胜范围。
所以:[19 , 162 = 9 * 2 * 9] Stan 必胜
由此可以找出解题方法,我把当前数字cur = 1,一次乘9,一次乘2,.......这样循环地乘下去,看什么时候超过n,超过n时看看现在乘了几次,
奇数次则是 Stan 赢,偶数次则是 Ollie 赢。
代码附上:
#include<bits/stdc++.h> using namespace std; typedef long long LL; int main(){ LL n; while(scanf("%d",&n) == 1){ LL mul = 1; int i; for(i = 0;mul < n;++i){ mul *= LL((i & 1) ? 2 : 9); } printf("%s ",(i & 1) ? "Stan wins." : "Ollie wins."); } return 0; }