#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; } |