#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; typedef long long ll; const int MAXN=1e6+5; int tab[MAXN]; map <pair<int,ll>,ll> dp; map <pair<int,ll>,ll> sum; const ll inf=1e18; ordered_set s; void init(ll n){ for(int i=1;i<=n;i++) dp[{i,0}]=1; for(int i=1;i<=n;i++){ ll x=1LL*i*(i-1)/2; ll z=1; for(ll j=1;j<=x;j++){ z=z+dp[{i-1,j}]-(j-i>=0 ? dp[{i-1,j-i}] : 0); if(z>inf){ dp[{i,j}]=inf; break; } dp[{i,j}]=z; } } for(int i=1;i<=n;i++) s.insert(i); } void solve(ll n,ll k,ll l){ if(n==0) return; if(l==0){ for(int i=1;i<=n;i++){ auto x=s.begin(); s.erase(x); cout << *x << ' '; } return; } ll sum=0; ll y; if(n==2) y=0; else y=(n-1)*(n-2)/2; ll m=l; int t=-1; if(m>y/2) m=y-l,t=1; ll i=1; if(m<0){ i+=-m; m=0; } for(;i<=n;i++,m+=t){ ll z=dp[{n-1,m}]; ll a=(z==0 && m>0 && n-1!=0 ? inf : z); sum+=a; if(sum>=k){ auto x=s.find_by_order(i-1); s.erase(x); cout << *x << ' '; solve(n-1,k-sum+a,l+1-i); return; } } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n,k; cin >> n >> k; init(n); if(n==1 && k==1) cout << 1; else if((n*(n-1))%4 || k>(dp[{n,n*(n-1)/4}]==0 ? inf : dp[{n,n*(n-1)/4}])) cout << "NIE"; else { cout << "TAK\n"; solve(n,k,n*(n-1)/4); } }
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 | #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; typedef long long ll; const int MAXN=1e6+5; int tab[MAXN]; map <pair<int,ll>,ll> dp; map <pair<int,ll>,ll> sum; const ll inf=1e18; ordered_set s; void init(ll n){ for(int i=1;i<=n;i++) dp[{i,0}]=1; for(int i=1;i<=n;i++){ ll x=1LL*i*(i-1)/2; ll z=1; for(ll j=1;j<=x;j++){ z=z+dp[{i-1,j}]-(j-i>=0 ? dp[{i-1,j-i}] : 0); if(z>inf){ dp[{i,j}]=inf; break; } dp[{i,j}]=z; } } for(int i=1;i<=n;i++) s.insert(i); } void solve(ll n,ll k,ll l){ if(n==0) return; if(l==0){ for(int i=1;i<=n;i++){ auto x=s.begin(); s.erase(x); cout << *x << ' '; } return; } ll sum=0; ll y; if(n==2) y=0; else y=(n-1)*(n-2)/2; ll m=l; int t=-1; if(m>y/2) m=y-l,t=1; ll i=1; if(m<0){ i+=-m; m=0; } for(;i<=n;i++,m+=t){ ll z=dp[{n-1,m}]; ll a=(z==0 && m>0 && n-1!=0 ? inf : z); sum+=a; if(sum>=k){ auto x=s.find_by_order(i-1); s.erase(x); cout << *x << ' '; solve(n-1,k-sum+a,l+1-i); return; } } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n,k; cin >> n >> k; init(n); if(n==1 && k==1) cout << 1; else if((n*(n-1))%4 || k>(dp[{n,n*(n-1)/4}]==0 ? inf : dp[{n,n*(n-1)/4}])) cout << "NIE"; else { cout << "TAK\n"; solve(n,k,n*(n-1)/4); } } |