「力扣1025」除数博弈

149 阅读1分钟

题目链接

除数博弈

思路

面对博弈问题,我们没有思路的时候,就先写几项出来看看结果,再猜想规律。

博弈条件的含义

  1. 选出任一x,满足0 < x < n 且 n % x == 0 「选出 n因数
  2. 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:

  1. n,x 是两个奇数相减所以结果必然是偶数;
  2. x>=1n=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;
};