#include <bits/stdc++.h>
using namespace std;
bool testcase_to_380(long long n, long long k, long long inv, long long cur, int c, long long A[])
{
long long **D;
D = new long long* [n+1];
for(int i=0; i<=n; i++)
D[i] = new long long [inv+1];
for(int i=0; i<=n; i++)
for(int j=0; j<=inv; j++)
D[i][j]=0;
D[1][0]=1;
for(int i=2; i<=n; i++){
//cout << i << ": " <<endl;
for(int j=0; j<=(i*(i-1)/2) && j<=inv; j++){
for(int p=1; p<=i && D[i][j]<=k; p++)
if(j>=p-1)
D[i][j]+=D[i-1][j-(p-1)];
//cout << " D[" << i << "][" << j << "] = " << D[i][j] <<endl;
}
}
if(D[n][inv]<k){
cout << "NIE\n";
return false;
}
long long k1=inv, a, ind; long long Value[n+1]; bool Taken[n+1];
for(int i=0; i<=n; i++)
Taken[i]=false;
for(int i=0; i<=n; i++)
Value[i]=i;
cur=0;
for(int e=n; e>=1; e--){
a=-1;
for(int i=1; i<=e && a==-1; i++)
if(cur+D[e-1][k1-(i-1)]>=k)
a=i, k1-=(i-1);
else
cur+=D[e-1][k1-(i-1)];
if(a==-1)
a=1;
//cout << e << " " << a << " " << Value[a] << " " << cur << " " << k << " " << k1 <<endl;
A[n-e+c]=Value[a]+c;
Taken[Value[a]]=true;
ind=1;
for(int l=1; l<=n; l++)
if(!Taken[l])
Value[ind++]=l;
}
return true;
}
bool testcase_over_380(long long n, long long k, long long inv, long long cur, int c, long long A[])
{
for(int i=0; i<(n/4); i++)
A[i]=i+1;
return testcase_to_380(n-(n/4),k,inv,cur,(n/4),A);
}
int main()
{
ios_base::sync_with_stdio(false), cin.tie(0);
long long n, k, inv, cur=0;
cin >> n >> k;
inv=(n*(n-1)/2);
if(inv%2!=0){
cout << "NIE\n";
return 0;
}
long long A[n+1];
bool good = (n<=380) ? testcase_to_380(n,k,inv/2,cur,0,A) : testcase_over_380(n,k,inv/2,cur,0,A);
if(good){
cout << "TAK\n";
for(int i=0; i<n; i++)
cout << A[i] << " ";
cout <<"\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 | #include <bits/stdc++.h> using namespace std; bool testcase_to_380(long long n, long long k, long long inv, long long cur, int c, long long A[]) { long long **D; D = new long long* [n+1]; for(int i=0; i<=n; i++) D[i] = new long long [inv+1]; for(int i=0; i<=n; i++) for(int j=0; j<=inv; j++) D[i][j]=0; D[1][0]=1; for(int i=2; i<=n; i++){ //cout << i << ": " <<endl; for(int j=0; j<=(i*(i-1)/2) && j<=inv; j++){ for(int p=1; p<=i && D[i][j]<=k; p++) if(j>=p-1) D[i][j]+=D[i-1][j-(p-1)]; //cout << " D[" << i << "][" << j << "] = " << D[i][j] <<endl; } } if(D[n][inv]<k){ cout << "NIE\n"; return false; } long long k1=inv, a, ind; long long Value[n+1]; bool Taken[n+1]; for(int i=0; i<=n; i++) Taken[i]=false; for(int i=0; i<=n; i++) Value[i]=i; cur=0; for(int e=n; e>=1; e--){ a=-1; for(int i=1; i<=e && a==-1; i++) if(cur+D[e-1][k1-(i-1)]>=k) a=i, k1-=(i-1); else cur+=D[e-1][k1-(i-1)]; if(a==-1) a=1; //cout << e << " " << a << " " << Value[a] << " " << cur << " " << k << " " << k1 <<endl; A[n-e+c]=Value[a]+c; Taken[Value[a]]=true; ind=1; for(int l=1; l<=n; l++) if(!Taken[l]) Value[ind++]=l; } return true; } bool testcase_over_380(long long n, long long k, long long inv, long long cur, int c, long long A[]) { for(int i=0; i<(n/4); i++) A[i]=i+1; return testcase_to_380(n-(n/4),k,inv,cur,(n/4),A); } int main() { ios_base::sync_with_stdio(false), cin.tie(0); long long n, k, inv, cur=0; cin >> n >> k; inv=(n*(n-1)/2); if(inv%2!=0){ cout << "NIE\n"; return 0; } long long A[n+1]; bool good = (n<=380) ? testcase_to_380(n,k,inv/2,cur,0,A) : testcase_over_380(n,k,inv/2,cur,0,A); if(good){ cout << "TAK\n"; for(int i=0; i<n; i++) cout << A[i] << " "; cout <<"\n"; } return 0; } |
English