HDOJ 1517A Multiplication Game(巴士博弈)

A Multiplication Game

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4726    Accepted Submission(s): 2685


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.
 

Sample Input
   
   
   
   
162 17 34012226
 

Sample Output
   
   
   
   
Stan wins. Ollie wins. Stan wins.
 

  此题目也是巴士博弈的一种,不过只是不是用的乘法了,与原来的加和确实有很大不同,但是本质上还是讨论谁先达到某一个数值,所用的数是在一个区间。

  初始的区间是2 to 9,如果n<=9,先手一定赢,如果大于9,必定会有一个界值。如果先手先选的是2,那么后手最大能选9,此时如果9<n<18,假设n=18,先手无论选2 to 9的任何一个数,后手都能达到十八则后手赢;如果n稍微大于18,则肯定是先手赢。此时n=18就是临界值;

  所以【2,9】,【10,18】是两个原始区间,前者是先手的必胜区间,后者是后手的必胜区间,若再度延伸,则区间应该,【19,162】有是先手的必胜区间,【163,324】又是后手的必胜区间。

  则前先手的必胜区间为【2*(18)^x,9*(18)^x】,后手的是【10*(18)^x,18*(18)^x】,则可以把n一直除以18,直到n<=18,再进行判断。

#include<iostream>
using namespace std;
int main()
{
    double n;
    while(cin>>n)
    {
        while(n>18)
            n/=18;
        if(n<=9)
            cout <<"Stan wins."<<endl;
        else
            cout <<"Ollie wins."<<endl;
    }
    return 0;
}



//有个问题,long long为什么不行,求大牛们解答,,,

你可能感兴趣的:(杭电,博弈)