转换成逆元,求出循环节
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e5+7;
int vs[M],a[M],b[M];
vector<int>v;
int n,k;
void solve(){
int r=v.size(),inv;
for(int i=0;i<r;i++) if((ll)k*i%r==1)inv=i;
for(int i=0;i<r;i++) b[v[i]]=v[(i+inv)%r];
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
if(!vs[i]){
v.clear();
int x=a[i];
while(!vs[x]){
vs[x]=1;
v.pb(x);
x=a[x];
}
solve();
}
}
for(int i=1;i<=n;i++) printf("%d ",b[i]);
return 0;
}
看了一下带花树,明天写一下博客然后把题目补了