![POJ 2505 A multiplication game [博弈] POJ 2505 A multiplication game [博弈]](https://image.shishitao.com:8440/aHR0cHM6Ly9ia3FzaW1nLmlrYWZhbi5jb20vdXBsb2FkL2NoYXRncHQtcy5wbmc%2FIQ%3D%3D.png?!?w=700&webp=1)
题意:两个人做游戏,每个人都可以在自己的回合里将数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]。
#include<stdio.h>
int main()
{
int n;
while (~scanf("%d", &n))
{
while (n)
{
n = (n + ) / ;//此时n为n点
if (n == )
{
printf("Stan wins.\n");
break;
}
n = (n + ) >> ;//此时n为p点
if (n == )
{
printf("Ollie wins.\n");
break;
}
}
}
return ;
}