题目
两个人轮流用2~9来乘n,使n不断扩大.
n开始为1,当给一个固定值k,谁先使n超过k谁赢.
1<k<4294967295
分析
设
fi
表示
i
是必胜态还是必败态.
很明显
∴[⌈n9.0⌉,n)
是必胜态.
∴[⌈⌈n9.0⌉2.0⌉,⌈n9.0⌉)
是必败态.
……
发现
fi
的函数值具有连续性,以此类推.
当得到
1
的时候就可以确定是必胜态还是必败态.
时间复杂度:
空间复杂度:
O(1)
小结
博弈论的问题通常有以下的解决思路:
①找规律,探究
f
函数的性质
②Nim游戏,或者
③记忆化搜索或递推,Alpha-Beta剪枝
代码
#include <cstdio>
#include <cmath>
typedef long long lint;
lint n;
int main(void)
{
for (;~scanf("%lld",&n);)
for (;;)
{
n=ceil(n/9.0);
if (n==1)
{
printf("Stan wins.\n");
break;
}
n=ceil(n/2.0);
if (n==1)
{
printf("Ollie wins.\n");
break;
}
}
return 0;
}