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.\n");

13                 break;

14             }

15             n = (n + 1) >> 1;//此时n为p点

16             if (n == 1)

17             {

18                 printf("Ollie wins.\n");

19                 break;

20             }

21         }

22     }

23     return 0;

24 }

 

你可能感兴趣的:(game)