//Tasowanie [TAS]
#include <stdio.h>
const int MX=1100100;
int n,m,c,i,j,prev,cur,a[MX],b[MX],p[MX],q[MX];
bool u[MX];
int main() {
scanf("%d%d",&n,&m);
for (i=1; i<=(1<<n); i++) scanf("%d",&a[i]);
p[1]=prev=1;
for (j=1; j<=n; j++) {
cur=(1<<j);
for (i=cur; i>prev; i--) p[i]=p[i-prev];
for (; i>0; i--) p[i]+=prev;
prev=cur;
}
for (i=1; i<=prev; i++) if (!u[i]) {
for (j=i, c=0; !u[j]; j=p[j], c++) {
b[c]=j;
u[j]=true;
}
cur=m%c;
for (j=0; j<c; j++, cur++) {
if (cur==c) cur=0;
q[b[j]]=b[cur];
}
}
for (i=1; i<=prev; i++) printf("%d%c",a[q[i]],(i==prev)?'\n':' ');
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | //Tasowanie [TAS] #include <stdio.h> const int MX=1100100; int n,m,c,i,j,prev,cur,a[MX],b[MX],p[MX],q[MX]; bool u[MX]; int main() { scanf("%d%d",&n,&m); for (i=1; i<=(1<<n); i++) scanf("%d",&a[i]); p[1]=prev=1; for (j=1; j<=n; j++) { cur=(1<<j); for (i=cur; i>prev; i--) p[i]=p[i-prev]; for (; i>0; i--) p[i]+=prev; prev=cur; } for (i=1; i<=prev; i++) if (!u[i]) { for (j=i, c=0; !u[j]; j=p[j], c++) { b[c]=j; u[j]=true; } cur=m%c; for (j=0; j<c; j++, cur++) { if (cur==c) cur=0; q[b[j]]=b[cur]; } } for (i=1; i<=prev; i++) printf("%d%c",a[q[i]],(i==prev)?'\n':' '); return 0; } |
English