POJ 2505 A multiplication game [博弈]

题意:两个人做游戏,每个人都可以在自己的回合里将数p乘以2到9之间的一个数,初始时p=1,谁先将p乘到大于等于n就算赢。

思路:一开始我算sg值,结果算来算去都没算明白。。。

后来看了别人题解,才豁然开朗。

首先,对于一个数m,计算出p在什么范围内可以乘到大于等于m。该范围即为[ceil(m/9), m - 1]。其中ceil()为向上取整。如果将每一个数字都看作一个局面的话,则在该区间内的点即为N点。

对于一个数m,计算出p在什么范围内只能乘到大于等于m。该范围即为[ceil(m/2), m - 1]。如果将每一个数字都看作一个局面的话,且m对应的局面为N点时,则在该区间内的点即为P点。

考虑到int类型取整的规则,将上述范围也可表示为[(m + 8) / 9, m - 1], [(m + 1) / 2, m - 1]。

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int n;
 5     while (~scanf("%d", &n))
 6     {
 7         while (n)
 8         {
 9             n = (n + 8) / 9;//此时n为n点
10             if (n == 1)
11             {
12                 printf("Stan wins.
");
13                 break;
14             }
15             n = (n + 1) >> 1;//此时n为p点
16             if (n == 1)
17             {
18                 printf("Ollie wins.
");
19                 break;
20             }
21         }
22     }
23     return 0;
24 }
原文地址:https://www.cnblogs.com/fenshen371/p/3287343.html