问题描述
学霸把要刷的N道题(编号为1-N)按顺序排成一圈,从1号题目开始循环计数(1,2,...),于是学霸开始做第一次数到1的题。秒掉这题后,他把剩下的题从下个位置起从1开始计数,然后做第二次数到2的题并从下个位置起重新开始计数,第K次刷第K道题并重新开始计数……问最终剩下哪道题?
注意:学霸可能会刷很多道题,因此数据范围很大,你需要用更快的算法才能追上学霸。
输入格式
仅一个数,N
输出格式
仅一个数,表示最后剩下的题序号
样例输入
5
样例输出
4
样例说明
学霸把题排成一圈:1-2-3-4-5-(循环的)
第一次刷1号:2-3-4-5-
第二次刷3号:2-4-5-
第三次刷2号:4-5-
第四次刷5号:4
故答案为4
数据规模和约定
对于40%的数据,N<=1000
对于80%的数据,N<=10000
对于100%的数据,N<=1000000
明显看出这是个约瑟夫环问题
红字为下标
以6道题为例 f(n)指当题目为n时答案的下标,递推公式如下
代码如下,最终答案加一即可
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
int ret = 0;
int k = n - 1;
for (int i = 2; i <= n; i++, k--) {
ret = (ret + k) % i;
}
int ans = ret + 1;
cout << ans;
return 0;
}