天天看点

poj 2505 A multiplication game(博弈)

【题目大意】:给出一个数n...两个人轮流游戏,每次可以给p=1乘上2~9之间的任意一个数,问谁先达到n。

【解题思路】:如果n的范围在2~9之间...先手胜,10~18之间后手胜....19~162之间...是由后手必胜态(10~18)转移过来的必败态(因为在10~18的情况下,是我要赢,我势必拿最大)...163~324是由先手必胜态(19~162)转移过来的后手必胜态...以此类推....

可以得到一堆先手必胜态和必败态的区间。~~然后找规律...发现区间的右端点都是*9*2*9*2...这样子得到的...所以只需要/18除完它,看剩下的数是在2~9直接还是>9即刻...

Orz~傻傻的用lld,wa了一次

【代码】:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
                   
using namespace std;
                   
#define eps 1e-8
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long

double n;

int main(){
   while(~scanf("%lf",&n)){
            while(n>18)
                     n=n/18;
            if(n<=9) printf("Stan wins.\n");
            else printf("Ollie wins.\n");
   }
   return 0;
}
           

继续阅读