A Multiplication Game
http://acm.hdu.edu.cn/showproblem.php?pid=1517
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3846 Accepted Submission(s): 2187
Problem Description
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.
Input
Each line of input contains one integer number n.
Output
For each line of input output one line either
Stan wins.
or
Ollie wins.
assuming that both of them play perfectly.
Stan wins.
or
Ollie wins.
assuming that both of them play perfectly.
Sample Input
162 17 34012226
Sample Output
Stan wins. Ollie wins. Stan wins.
Source
Recommend
②、如果输入是10~18(9*2),因为Ollie是后手,不管第一次Stan乘的是多少,Stan肯定在2~9之间,所以Ollie必胜。
③、如果输入的是19~162(9*2*9),因为Stan是先手最大取9,再次Olie 取最多也是9 ,剩余小于9的一个数,刚好Stan必胜
④、如果输入是163~324(2*9*2*9),同理,这个是Ollie的必胜范围。
…………
可以发现必胜态是对称的。
因此我们只需判断将一个数不断除以18(9*2)之后小于或等于9,那么此时Stan刚好可以到达必胜点,否则就是Olie必胜
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
int main()
{
double n;
while(~scanf("%lf",&n))
{
while(n>18)
n/=18;
if(n<=9)
printf("Stan wins.\n");
else
printf("Ollie wins.\n");
}
return 0;
}
#include<cstring>
#include<cstdlib>
#include<algorithm>
int main()
{
double n;
while(~scanf("%lf",&n))
{
while(n>18)
n/=18;
if(n<=9)
printf("Stan wins.\n");
else
printf("Ollie wins.\n");
}
return 0;
}