fork download
  1. //#pragma GCC optimize("Ofast,unroll-loops")
  2. //#pragma GCC target("avx2,tune=native")
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. #define file "permutations"
  7. #define ff(i,a,b) for(auto i=(a); i<=(b); ++i)
  8. #define ffr(i,b,a) for(auto i=(b); i>=(a); --i)
  9. #define nl "\n"
  10. #define pb emplace_back
  11. #define all(s) (s).begin(), (s).end()
  12.  
  13. using ll = long long;
  14.  
  15. inline void rf(){
  16. ios::sync_with_stdio(false);
  17. cin.tie(nullptr);
  18. if (fopen(file".inp","r")){
  19. freopen(file".inp","r",stdin);
  20. freopen(file".out","w",stdout);
  21. }
  22. }
  23.  
  24. const ll BASE = 22071997LL;
  25. const ll MODH = 1000000000LL + 19972207LL;
  26.  
  27. ll C[40][40];
  28.  
  29. ll comb(int n, int k){
  30. if(k<0 || k>n) return 0;
  31. return C[n][k];
  32. }
  33.  
  34. ll S(int m, int V){
  35. if(V<m) return 0;
  36. if(V>2*m) V=2*m;
  37. return comb(V,m) - comb(V,m+1);
  38. }
  39.  
  40. ll catalan(int n){
  41. return comb(2*n, n) / (n+1);
  42. }
  43.  
  44. int main(){
  45. rf();
  46. // precompute C up to 36
  47. ff(i,0,36){
  48. C[i][0]=C[i][i]=1;
  49. ff(j,1,i-1) C[i][j]=C[i-1][j-1]+C[i-1][j];
  50. }
  51.  
  52. int T;
  53. if(!(cin>>T)) return 0;
  54. while(T--){
  55. int n; ll k;
  56. cin>>n>>k; // n <= 18
  57.  
  58. ll cat = catalan(n);
  59. if(k>cat){ cout<<-1<<nl; continue; }
  60.  
  61. vector<int> leftVals;
  62. int upper = 2*n-1;
  63. for(int m=n; m>=1; --m){
  64. int lo=m, hi=min(upper, 2*m-1);
  65. while(lo<hi){
  66. int mid=(lo+hi)>>1;
  67. if(S(m,mid) >= k) hi=mid;
  68. else lo=mid+1;
  69. }
  70. int v=lo;
  71. k -= S(m, v-1);
  72. leftVals.pb(v);
  73. upper = v-1;
  74. }
  75. sort(all(leftVals));
  76.  
  77. vector<int> perm; perm.reserve(2*n);
  78. for(int i=(int)leftVals.size()-1;i>=0;--i) perm.pb(leftVals[i]);
  79.  
  80. vector<int> mark(2*n+1,0);
  81. for(int x:leftVals) mark[x]=1;
  82. for(int x=2*n; x>=1; --x) if(!mark[x]) perm.pb(x);
  83.  
  84. ll ans=0, pw=1;
  85. ff(i,1,2*n){
  86. pw = (pw * BASE) % MODH;
  87. ans = (ans + (ll)perm[i-1] * pw) % MODH;
  88. }
  89. cout<<ans<<nl;
  90. }
  91. return 0;
  92. }
  93.  
Success #stdin #stdout 0.01s 5296KB
stdin
3
3 1
3 2
3 3
stdout
827482776
815013008
426921014