1074 约瑟夫环 V2
题目
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
输入
2个数N和K,表示N个人,数到K出列。(2 <= N <= 10^18, 2 <= K <= 1000)
输出
最后剩下的人的编号
输入样例
3 2
输出样例
3
/*
* F(1)=0
* F(2)=F(1)+k
* F(i)=F(i-1)+k
* F(i)=(F(i-1)+k)%i
* k<<n
* F(i)=(F(i-w)+k*w)%i
* F(i+w)=(F(i)+k*w)%(i+w)
* w=(i-ans)/k+1
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#define ll long long
using namespace std;
ll n, k;
int main() {
// 人数、间隔
cin >> n >> k;
ll ans = 0, w;
for (ll i = 1; i <= n; i += w) {
w = (i - ans) / k + 1;
if (i + w > n) {
w = n - i;
}
if (w == 0) {
break;
}
ans = (ans + k * w) % (i + w);
}
cout << ans + 1 << endl;
return 0;
}