f(n)表示有n個人,最后一個出局的人的編號
則f(n-1)表示有n-1個人,最后一個出局的人的編號
首先這一個大圓圈,我們從0開始給他們編號,然后開始從1報數,報數到K則出局
那么第一個出局的人,他的下標編號就是K-1
有一個出局的人之后,從他的下一個開始重新給他們編號,那么就是n-1個人,剛才編號是K的現在更新他的編號是0
靈魂畫師.png
0 -- 1 -- 2 -- 3 (f[n-1],即更新后最后一個出局的人的下標編號)
k -- k+1 -- k+2 -- k+3 (最后出局的人原本的的下標編號)
那么我們就找到了 f(n-1) 和 f(n) 的一個對應關系
f(n) = (f(n-1) + k) % n
代碼實現如下:
using namespace std;
const int N = 1000010;
int n, k;
int f[N];
int main()
{
f[1] = 0;
cin >> n >> k;
for(int i = 2; i <= n ; i++) f[i] = (f[i-1] + k) % i;
cout << f[n] + 1 << endl;
}