hdu 1517 K(2~9)倍博弈

http://acm.hdu.edu.cn/showproblem.php?pid=1517

以前做过不过不认真,现在又忘了。

出处:http://qianmacao.blog.163.com/blog/static/203397180201223174133470/

博弈问题
题意:两人玩游戏,从1开始,轮流对数进行累乘,直到超过一个指定的数。
算法分析:

①、如果输入是29,因为Stan是先手,所以Stan必胜。

②、如果输入是1018(9*2),因为Ollie是后手,不管第一次Stan乘的是多少,Stan肯定在29之间,如果Stan乘以2,那么Ollie就乘以9,那么Ollie乘以大于1的数都能超过1018中的任何一个数,Ollie必胜。

③、如果输入的是19162(9*2*9),那么这个范围Stan必胜。

④、如果输入是163324(2*9*2*9),这个是Ollie的必胜范围。

…………

可以发现必胜态是对称的。

如果“我方”首先给出了一个在N不断除18后的得到不足18的数M,“我方”就可以胜利,然而双方都很聪明,所以这样胜负就决定与N了,如果N不断除18后的得到不足18的数M,如果1<M<=9则先手胜利,即Stan wins.如果9<M<=18则后手胜利。

View Code
// I'm lanjiangzhou
//C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
//C++
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cctype>
#include <stack>
#include <string>
#include <list>
#include <queue>
#include <map>
#include <vector>
#include <deque>
#include <set>
using namespace std;

//*************************OUTPUT*************************
#ifdef WIN32
#define INT64 "%I64d"
#define UINT64 "%I64u"
#else
#define INT64 "%lld"
#define UINT64 "%llu"
#endif

//**************************CONSTANT***********************
#define INF 0x3f3f3f3f

// aply for the memory of the stack
//#pragma comment (linker, "/STACK:1024000000,1024000000")
//end


int main(){
    double n;
    while(scanf("%lf",&n)!=EOF){
        while(n>18){
            n=n/18;
        }
        if(n<=9) printf("Stan wins.\n");
        else printf("Ollie wins.\n");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/lanjiangzhou/p/3022567.html