#include <iostream>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll n,k;
ll a[N],pre[N];
int main() {
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];//第i个元素可以跳到第i个位置
}
int now=1;
ll cnt=1;
while(k--){
now=a[now];
//遇到重复位置,进行优化
if(pre[now]) k%=cnt-pre[now];//计算出循环的长度cnt-pre[now],对k取模长度,直接跳到循环内的对应位置
pre[now]=cnt++;//记录已经去过的地方
}
cout<<now;
return 0;
}
这段代码是一个模拟约瑟夫环问题的算法,主要思路是使用数组来模拟人们依次出列的过程。
- 代码首先定义了一些常量和变量,包括数组大小 N,整数变量 n, k,以及数组 a 和 pre 用于存储元素和记录已经走过的位置。
- 用户输入 n 和 k,表示约瑟夫环的总人数和游戏进行的次数。
- 然后使用循环读入 n 个整数,表示每个人可以到达的下一个位置。
- 初始化当前位置为 1,已经走过的步数为 0。
- 通过一个循环,不断按照 a 数组中的指示移动当前位置 now 到下一个位置。
- 如果现在的位置之前出现过,即 pre[now]不为 0,则进行优化,节省计算时间。
- 最后输出当前位置 now。