对于一个排列A,给定一个置换规则P,在使用置换P K 次置换得到 A,
即,
P
k
=
A
P^{k} = A
Pk=A
A
x
k
=
A
A^{xk} = A
Axk=A
P
=
A
x
P = A^{x}
P=Ax
所以 x 就是 k 关于m的逆元,m 就是每个环的大小。
/*
求 p, p^k = a,
k 为质数。
a ^ xk = a
p = a ^ x
其中 xk = 1 mod m (m 是每个环的周期数)
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+100;
int n,m,k;
bool vis[N];
int a[N],b[N];
vector<int>f;
void solve(){
int sz = f.size(),inv;
for (int i = 0; i < sz; ++i) if (1ll*i*k%sz == 1) inv = i;
for (int i = 0; i < sz; ++i) b[f[i]] = f[(i + inv) % sz];
}
int main(){
scanf("%d%d",&n,&k);
for (int i = 1; i <= n; ++i)
scanf("%d",&a[i]);
for (int i = 1; i <= n; ++i){
if (!vis[i]){
vis[i] = 1;
f.clear();
int now = a[i];
f.push_back(i);
while(!vis[now]){
vis[now] = 1;
f.push_back(now);
now = a[now];
}
solve();
}
}
for (int i = 1; i <= n; ++i)
printf("%d%c",b[i],i==n?'\n':' ');
return 0;
}