A Multiplication Game
Stan and Ollie play the game of multiplication by multiplying an integer p by one of the numbers 2 to 9. Stan always starts with p = 1, does his multiplication, then Ollie multiplies the number, then Stan and so on. Before a game starts, they draw an integer 1 < n < 4294967295 and the winner is who first reaches p >= n.
Stan wins.
or
Ollie wins.
assuming that both of them play perfectly.
162 17 34012226
Stan wins. Ollie wins. Stan wins.
分析:
如果输入是 2 ~ 9 ,因为Stan 是先手,所以Stan 必胜(x9) 如果输入是 10~18 ,因为Ollie 是后手,不管第一次Stan 乘的是什么,Stan肯定在 2 ~ 9 之间,(x2) 如果Stan乘以 2 ,那么Ollie就乘以 9 ,就到18了,如果Stan乘以 9 , 那么Ollie乘以大于1的数都都能超过 10 ~ 18 中的任何一个数。Ollie 必胜 (第一个循环先Stan必胜再Ollie必胜,相当于乘了18) 同理如果输入是 19 ~ 162,相当于在上一个必胜态乘2-9一定是那么这个范围是 Stan 的必胜态(x9) 如果输入是 163 ~ 324 ,无论上一个必胜态是什么,乘9都可以属于或者大于这个范围,这时这是Ollie的必胜态(x2) (同样乘了18) ............ 必胜态是对称的!!!
如果"我方"首先给出了一个在N不断除18后的得到不足18的 数M,"我方"就可以取得胜利,然而双方都很聪明,所以这样胜负就决定于N了,如果N不断除 18后的得到不足18的数M,如果1<M<=9则先手胜利,即Stan wins.如果9<M<=18 则后手胜利. 也就是说,18是一个循环。code:
#include <iostream>
using namespace std;
int main(){
double n;
while(cin >> n){
while(n > 18)
n /= 18;//这里用double是因为除以18如果是整形会取整,导致结果错误
if(n <= 9)
cout << "Stan wins." << endl;
else
cout << "Ollie wins." << endl;
}
}