最优子问题:
m%n
(从零开始)x
(从零开始)m%n
开始进行删除,最后剩余的数为 (m%n + x) % n
PS:
(m%n + x) % n
<x
(因为(x + n) % n = x
, 而m%n < n
)
所以删除m%n
不会影响结果序号
化简公式:
(m%n + x) % n
= (m%n%n + x%n) % n
= (m%n + x%n) % n
= (m + x) % n
class Solution {
int f(int n, int m) {
if (n == 1) // 当 n = 1 时,只有一个0
return 0;
int x = f(n - 1, m); // 计算从0开始,(n-1)个数时,最后剩余的数的位置
return (m + x) % n; // n个数时删除的数的位置开始【(m%n + x) % n】
}
public:
int lastRemaining(int n, int m) {
return f(n, m);
}
};
m%n%n%n%n ...
= m%n
(a%n + b%n) % n
= (a + b) % n
(a*b) % n
= (a%n * b%n) % n
如果a ≡ b (mod m),c ≡ d (mod m),那么
(1)a ± c ≡ b ± d (mod m);
(2)a * c ≡ b * d (mod m)。
同
余 定
理
【数论】