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
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
#include<sstream>
#include<fstream>
#include<algorithm>
#include <vector>
#include <stdexcept>
#include <cstring>
#include <set>
#define ll long long
using namespace std;


vector<vector<ll> > D;

ll oo = (ll)1e18 + 1;

ll getVal(ll n, ll inv) {
    if(inv ==0)return 1;
    if(n<=1)return 0;
    ll all = n*(n-1)/2;
    if(inv>all)return 0;
    if(inv > all - inv)inv = all -inv;
    if(inv >= D[n].size())return oo;
    return D[n][inv];
}

void fill_D(int n){
    D.push_back(vector<ll>());
    D.push_back(vector<ll>());
    for(ll nn=2;nn<n;nn++){
        vector<ll> R;
        R.push_back(1);
        for(ll inv =1;inv<=nn*(nn-1)/2;inv++){
            ll r =0;
            for(ll s = max(1LL,nn-inv);s<=nn;s++){
                ll p = nn-s;
                r += getVal(nn-1,(inv-p));
                if(r>=oo){
                    r=oo;
                    break;
                }
            }
            if(r==oo)break;
            else R.push_back(r);
        }
        D.push_back(R);
   //     if(nn%1000==0)cout <<nn<<": "<< R.size()<<endl;
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    istream& my_in = cin;
  /*  for(int n=1;n<50;n++) {
        int nn = n*(n-1);
        if(nn%4==0)cout << count(n,nn/4)<<" ";
        else cout <<"0 ";
    }
    cout << endl;*/

   /* for(int i=1;i<100;i++)for(int j=0;j<200;j++){
        ll res = count(i,j);
        if(res != D[i][j]) {
                cout << "error "<<i<<" "<<j<<endl;
        }
        if(D[i][j]==0)cout <<"0";
        else if(D[i][j]==oo)cout <<".";
        else cout <<"x";
        if(j==199)cout << endl;
    }*/
  //  cout << count(10000,5)<<endl;
  //  cout <<getVal(10000,5)<<endl;
    ll n; ll k;
    cin >> n >>k;
    //n = 5;k=1;
    fill_D(n+1);
    if (n*(n-1)%4 !=0 ){
        cout <<"NIE\n";
        return 0;
    }
    ll all = getVal(n, n*(n-1)/4);
    if(k>all) {
        cout <<"NIE\n";
        return 0;
    }
     set<int> S;
    for(int i=1;i<=n;i++)S.insert(i);
    cout <<"TAK\n";
    ll need_inv = n*(n-1)/4;
    for(int i=0;i<n;i++) {
        auto it = S.begin();
        ll skipped =0;
        ll current_pairs = (n-i-1)*(n-i-2)/2;
        ll to_skip = max(0LL, need_inv - current_pairs);
        if(to_skip < S.size() - to_skip){
            std::advance(it, to_skip);
        } else {
            it = S.end();
            std::advance(it, to_skip - S.size());
        }
        for(int el =to_skip;el<n;el++){
            ll av = getVal(n-i-1, need_inv - el);
            if(av +skipped >=k) {
                cout << *it << " ";
                S.erase(it);
                k -=skipped;
                need_inv -=el;
                break;
            } else {
                skipped +=av;
            }
            it++;
        }
    }
    cout <<endl;
    return 0;
}