#include using namespace std; using ll = long long; ll modinv(ll x, ll m){ if (m == 1) {return 0;} for (ll res = 0; res < m; res++){ if ((res*x) % m == 1) {return res;} } } void solve(){ ll N,p; cin >> N >> p; vector A(N+1); for (int i = 1; i <= N; i++){ cin >> A[i]; } //サイクルに分解 vector>> cycle(N+1); vector seen(N+1,false); for (int i = 1; i <= N; i++){ if (seen[i]) {continue;} vector v; while (!seen[i]){ seen[i] = true; v.push_back(i); i = A[i]; } cycle[ssize(v)].push_back(v); } //構築 vector B(N+1); for (int T = 1; T <= N; T++){ if (ssize(cycle[T]) == 0){continue;} if (T % 2 == 1){ ll d = modinv(2*p,T); while (ssize(cycle[T]) >= 1){ vector v = cycle[T].back(); cycle[T].pop_back(); for (int k = 0; k < T; k++){ B[v[k]] = v[(k-d+T)%T]; } } } else{ ll d = modinv(p,T); while (ssize(cycle[T]) >= 2){ vector u = cycle[T].back(); cycle[T].pop_back(); vector v = cycle[T].back(); cycle[T].pop_back(); for (int k = 0; k < T; k++){ B[u[k]] = v[k]; B[v[k]] = u[(k-d+T)%T]; } } if (ssize(cycle[T]) == 0){continue;} d = modinv(2*p,T-1); vector v = cycle[T].back(); for (int k = 0; k < T; k++){ B[v[k]] = v[(k-d+T-1)%(T-1)]; } } } for (int i = 1; i <= N; i++){ cout << B[i]; if (i == N) {cout << '\n';} else {cout << ' ';} } } int main(){ ll T; cin >> T; while(T--) {solve();} }