由于n是偶数,每次洗牌相当于把当前序列平方。
也就是说,gcd(k,n)==1,所以置换不会分裂。
根据a1[i]=a[i*k%n];
a1是置换a的k次方得到的置换。
现在已知a1,求a。
k=2^s;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define re register
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(int n){cnt=1;for(int i=0;i<=n;i++)head[i]=0;}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
int a[M],p[M],b[M],q[M];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)cin>>a[i];
q[0]=1;
for(int i=1;i<n;i++)q[i]=a[q[i-1]-1];
//q[i]=p[i*z%n]
ll z=1;
for(int i=1;i<=k;i++)z=z*2%n;
for(int i=0;i<n;i++)
{
int tp=i*z%n;
p[tp]=q[i];
}
for(int i=0;i<n;i++)
b[p[i]-1]=p[(i+1)%n];
for(int i=0;i<n;i++)cout<<b[i]<<" ";
cout<<endl;
return 0;
}