孩子们的游戏(圆圈中最后剩下的数)

你快乐吗?

Posted by bbkgl on September 26, 2019

孩子们的游戏(圆圈中最后剩下的数)

C++,数学题。

真的是一道纯粹的数学题。

网上的解析都是推公式,我这里给出一个例子说明。。。

为了保证排版不乱,例子放在代码块里。

n = 6, m = 3
4行的数字表示序号,以下先模拟一遍过程
    
0 1 2 3 4 5
0 1 2 3 4 5
3 4 5 0 1
0 1 3 4
4 0 1
4 0
0          ----所以0就是答案,过程很简单

同样,第13行表示序号,i是剩余孩子的数量,a是目标数0的序号值
以下过程一定要从下往上看!!!!

0 1 2 3 4 5   i  a
0 1 2 3 4 5   6  0 = (3 + 3) % 6     -----最终答案,得出规律ans = (ans + m) % i
3 4 5 0 1     5  3 = (0 + 3) % 5
0 1 3 4       4  0 = (1 + 3) % 4
4 0 1         3  1 = (1 + 3) % 3
4 0           2  1 = (0 + 3) % 2
0             1  0 = 0

代码放下面:

class Solution {
public:
    int LastRemaining_Solution(int n, int m) {
        if (!n) return -1;
        int ans = 0;
        for (int i = 2; i <= n; i++)
            ans = (ans + m) % i;
        return ans;
    }
};