题目链接
思路
面对博弈问题,我们没有思路的时候,就先写几项出来看看结果,再猜想规律。
博弈条件的含义
- 选出任一
x,满足0 < x < n 且 n % x == 0「选出n的因数」 - 用
n-x替换黑板上的数字n「后手将面临减少后的n」
写几项出来猜想规律
n 结果
1 A 无法在 (0,1) 中操作, false (先手输)
2 A 只能选择`1`, 剩下`1`给 B, 由于`n=1`的结论是先手输, 所以 B 输, A 赢, true (先手赢)
3 A 只能选择`1`, 剩下`2`给 B, 由于`n=2`的结论是先手赢, 所以 B 赢, A 输, false (先手输)
4 A 能选择`1`或`2`, 由于`n=3先手输`,`n=2先手赢`, 而 A 以最佳状态参赛,她要让 B 输, 得让 B 面临 `n=3`, 所以 A 选择 `1`, 最后 B 输, A 赢 true (先手赢)
根据上面的规律,可以猜想: n为奇数时先手输, n为偶数时先手赢。
证明
根据数学归纳法的思想
当 n=1 或 n=2 时, 从写出来的几项可知猜想成立。 当 n>2 时, 假设 n<=k 时猜想成立, 现在证明 n=k+1 时猜想成立,即可证明所有情况下猜想成立。
假设 n<=k 时猜想成立,证明 n=k+1 时猜想成立
n=k+1 为奇数时
A 选出的 x 是 n 的因数,那么 x 必然是奇数且大于等于 1, 这样一来 B 面临的 n-x:
n,x是两个奇数相减所以结果必然是偶数;x>=1且n=k+1, 所以n-x<=k;
也就是说,B 面临 1 个偶数, 我们已经假设了 n<=k 时猜想成立 (此时B面临的n就是n-x, 是 <=k 的),根据猜想, 偶数情况先手赢, 所以 B 赢, A 输。
连贯起来,n=k+1 为奇数时, A 输, 也就是先手输。
n=k+1 为偶数时
A 选出的 x 是 n 的因数,那么 x 可以是奇数也可以是偶数。
如果 A 选出一个奇数 x,那么 n-x 必然是一个奇数,并且由于 k+1-x<=k, 所以 n-x<=k,B 面临 n-x 的时候,根据假设, 面临奇数时先手输, 所以 B 输, 所以 A 赢。
连贯起来, n=k+1为偶数时, A 赢, 也就是先手赢。
总结
综上所述,在任意情况下,n为奇数时先手输,n为偶数时先手赢。
代码
TypeScript
function divisorGame(n: number): boolean {
return n % 2 === 0;
};