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 }