#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#include <inttypes.h>
int n;
int dat[250001];
int64_t k;
int64_t res=0;
void printArray(bool ln) {
for(int i=0;i<n;++i) printf("%d ", dat[i]);
if(ln) printf("\n");
}
void swap(int a, int b) {
int tmp=dat[a];
dat[a]=dat[b];
dat[b]=tmp;
}
void reverse(int from, int to) {
while(from<to) {
--to;
swap(from, to);
++from;
}
}
int total() {
int a=0;
int b=0;
for(int i=0;i<n;++i) {
int v=dat[i];
for(int j=i+1;j<n;++j) if(v>dat[j]) ++b;
for(int j=0;j<i;++j) if(v>dat[j]) ++a;
}
return a+b;
}
bool check() {
int a=0;
int b=0;
for(int i=0;i<n;++i) {
int v=dat[i];
for(int j=i+1;j<n;++j) if(v>dat[j]) ++b;
for(int j=0;j<i;++j) if(v>dat[j]) ++a;
}
return a==b;
}
bool iterate() {
int i=n-1;
for(;;) {
int ii=i;
--i;
if(dat[i]<dat[ii]) {
int j=n;
while(!(dat[i]<dat[--j]));
swap(i,j);
reverse(ii, n);
// printArray(true);
if(check()) {
if(++res==k) return true;
}
i=n-1;
}
if(i==0) {
reverse(0, n);
return false;
}
}
}
int main(int argc, char** argv) {
scanf("%d %" SCNd64, &n, &k);
for(int i=0;i<n;++i) dat[i]=i+1;
if((total()&1)==1) { // jak jest nieparzysta ilość to nigdy nie nie ułoży dobrze
printf("NIE\n");
return 0;
}
if(iterate()) {
printf("TAK\n");
for(int i=0;i<n;++i) printf("%d ", dat[i]);
printf("\n");
} else {
printf("NIE\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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include<stdio.h> #include<stdlib.h> #include<stdint.h> #include <inttypes.h> int n; int dat[250001]; int64_t k; int64_t res=0; void printArray(bool ln) { for(int i=0;i<n;++i) printf("%d ", dat[i]); if(ln) printf("\n"); } void swap(int a, int b) { int tmp=dat[a]; dat[a]=dat[b]; dat[b]=tmp; } void reverse(int from, int to) { while(from<to) { --to; swap(from, to); ++from; } } int total() { int a=0; int b=0; for(int i=0;i<n;++i) { int v=dat[i]; for(int j=i+1;j<n;++j) if(v>dat[j]) ++b; for(int j=0;j<i;++j) if(v>dat[j]) ++a; } return a+b; } bool check() { int a=0; int b=0; for(int i=0;i<n;++i) { int v=dat[i]; for(int j=i+1;j<n;++j) if(v>dat[j]) ++b; for(int j=0;j<i;++j) if(v>dat[j]) ++a; } return a==b; } bool iterate() { int i=n-1; for(;;) { int ii=i; --i; if(dat[i]<dat[ii]) { int j=n; while(!(dat[i]<dat[--j])); swap(i,j); reverse(ii, n); // printArray(true); if(check()) { if(++res==k) return true; } i=n-1; } if(i==0) { reverse(0, n); return false; } } } int main(int argc, char** argv) { scanf("%d %" SCNd64, &n, &k); for(int i=0;i<n;++i) dat[i]=i+1; if((total()&1)==1) { // jak jest nieparzysta ilość to nigdy nie nie ułoży dobrze printf("NIE\n"); return 0; } if(iterate()) { printf("TAK\n"); for(int i=0;i<n;++i) printf("%d ", dat[i]); printf("\n"); } else { printf("NIE\n"); } return 0; } |
English