idea:令F(n)为最后剩下的下标。n个小朋友(从0开始)去掉第m-1个以后,第m个成了第0个,因此下标x映射到从0开始应该为P(x) = (x-m) % n. 则映射后的下标想映射回原下标则
P
−
1
(
x
)
=
(
x
+
m
)
%
n
P^{-1}(x) = (x+m)\%n
P−1(x)=(x+m)%n。n-1个小朋友最后剩下的是F(n-1),只需要映射回n个小朋友对应的下标即可。因此
F
(
n
)
=
P
−
1
(
F
(
n
−
1
)
)
=
(
F
(
n
−
1
)
+
m
)
%
n
F(n) = P^{-1}(F(n-1))=(F(n-1)+m)\%n
F(n)=P−1(F(n−1))=(F(n−1)+m)%n
code
class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if (n < 1 || m < 1) return -1;
int ans = 0;
for (int f = 1; f < n; f++){
ans = (ans + m) % (f+1) ;
}
return ans;
}
};