@@ -108,25 +108,341 @@ tags:
108
108
#### Python3
109
109
110
110
``` python
111
-
111
+ from typing import List
112
+ from math import factorial
113
+ import heapq
114
+
115
+ class Solution :
116
+ def permute (self , xxy : int , yyz : int ) -> List[int ]:
117
+
118
+ kasu = {}
119
+ nnss = []
120
+ majs = []
121
+ ajwi = heapq.heappush
122
+ laoq = []
123
+
124
+ zzp = [i for i in range (1 , xxy + 1 ) if i % 2 == 1 ]
125
+ zzq = [i for i in range (1 , xxy + 1 ) if i % 2 == 0 ]
126
+
127
+ ppp = []
128
+ nxr = None
129
+
130
+ for pps in range (xxy):
131
+ if pps == 0 :
132
+ cnd = sorted (zzp + zzq)
133
+ else :
134
+ cnd = zzp if nxr == 1 else zzq
135
+
136
+ fff = False
137
+ for cndt in cnd:
138
+ if cndt % 2 == 1 :
139
+ nxt = 0
140
+ noo = len (zzp) - 1
141
+ nee = len (zzq)
142
+ else :
143
+ nxt = 1
144
+ noo = len (zzp)
145
+ nee = len (zzq) - 1
146
+
147
+ llq = noo + nee
148
+ if llq == 0 :
149
+ cnt = 1
150
+ else :
151
+ if nxt == 1 :
152
+ if noo != (llq + 1 ) // 2 or nee != llq // 2 :
153
+ cnt = 0
154
+ else :
155
+ cnt = factorial(noo) * factorial(nee)
156
+ else :
157
+ if nee != (llq + 1 ) // 2 or noo != llq // 2 :
158
+ cnt = 0
159
+ else :
160
+ cnt = factorial(noo) * factorial(nee)
161
+
162
+ ajwi(nnss, cnt)
163
+ ajwi(majs, llq)
164
+
165
+ if cnt >= yyz:
166
+ ppp.append(cndt)
167
+ if cndt % 2 == 1 :
168
+ zzp.remove(cndt)
169
+ nxr = 0
170
+ else :
171
+ zzq.remove(cndt)
172
+ nxr = 1
173
+ fff = True
174
+ break
175
+ else :
176
+ yyz -= cnt
177
+
178
+ ajwi(laoq, len (ppp))
179
+
180
+ if not fff:
181
+ return []
182
+ return ppp
112
183
```
113
184
114
185
#### Java
115
186
116
187
``` java
117
-
188
+ import java.util.* ;
189
+
190
+ class DPHelper {
191
+ static final long ok = 10000000000000000L ;
192
+ long [][][] dp = new long [101 ][101 ][2 ];
193
+ boolean [][][] vis = new boolean [101 ][101 ][2 ];
194
+
195
+ long compute (int o , int e , int p ) {
196
+ if (o == 0 && e == 0 ) return 1 ;
197
+ if (vis[o][e][p]) return dp[o][e][p];
198
+
199
+ long r = 0 ;
200
+ if (p == 1 ) {
201
+ if (o == 0 ) r = 0 ;
202
+ else r = o * compute(o - 1 , e, 0 );
203
+ } else {
204
+ if (e == 0 ) r = 0 ;
205
+ else r = e * compute(o, e - 1 , 1 );
206
+ }
207
+
208
+ if (r > ok) r = ok;
209
+ vis[o][e][p] = true ;
210
+ dp[o][e][p] = r;
211
+ return r;
212
+ }
213
+ }
214
+
215
+ class SortHelper {
216
+ void sortList (ArrayList<Integer > list ) {
217
+ Collections . sort(list);
218
+ }
219
+ }
220
+
221
+ class PermutationHelper {
222
+ List<Integer > buildPermutation (int p , ArrayList<Integer > O , ArrayList<Integer > E , long k , DPHelper d ) {
223
+ List<Integer > ans = new ArrayList<> ();
224
+ if (O . size() + E . size() == 0 ) return ans;
225
+ int i = 0 ;
226
+
227
+ if (p == 1 ) {
228
+ while (i < O . size()) {
229
+ long cnt = d. compute(O . size() - 1 , E . size(), 0 );
230
+ if (k > cnt) {
231
+ k -= cnt;
232
+ i++ ;
233
+ } else {
234
+ int x = O . get(i);
235
+ O . remove(i);
236
+ ans. add(x);
237
+ ans. addAll(buildPermutation(0 , O , E , k, d));
238
+ return ans;
239
+ }
240
+ }
241
+ } else {
242
+ while (i < E . size()) {
243
+ long cnt = d. compute(O . size(), E . size() - 1 , 1 );
244
+ if (k > cnt) {
245
+ k -= cnt;
246
+ i++ ;
247
+ } else {
248
+ int x = E . get(i);
249
+ E . remove(i);
250
+ ans. add(x);
251
+ ans. addAll(buildPermutation(1 , O , E , k, d));
252
+ return ans;
253
+ }
254
+ }
255
+ }
256
+ return ans;
257
+ }
258
+
259
+ List<Integer > alternateFormation (ArrayList<Integer > O , ArrayList<Integer > E , long k , DPHelper d , int n , SortHelper s ) {
260
+ List<Integer > ans = new ArrayList<> ();
261
+ int tot = O . size() + E . size();
262
+ if (tot % 2 == 1 ) {
263
+ int i = 0 ;
264
+ while (i < O . size()) {
265
+ long cnt = d. compute(O . size() - 1 , E . size(), 0 );
266
+ if (k > cnt) {
267
+ k -= cnt;
268
+ } else {
269
+ int x = O . get(i);
270
+ O . remove(i);
271
+ ans. add(x);
272
+ ans. addAll(buildPermutation(0 , O , E , k, d));
273
+ return ans;
274
+ }
275
+ i++ ;
276
+ }
277
+ } else {
278
+ ArrayList<Integer > U = new ArrayList<> ();
279
+ U . addAll(O );
280
+ U . addAll(E );
281
+ s. sortList(U );
282
+ int i = 0 ;
283
+ while (i < U . size()) {
284
+ int x = U . get(i);
285
+ if (O . contains(x)) {
286
+ long cnt = d. compute(O . size() - 1 , E . size(), 0 );
287
+ if (k > cnt) {
288
+ k -= cnt;
289
+ } else {
290
+ int idx = O . indexOf(x);
291
+ O . remove(idx);
292
+ ans. add(x);
293
+ ans. addAll(buildPermutation(0 , O , E , k, d));
294
+ return ans;
295
+ }
296
+ } else {
297
+ long cnt = d. compute(O . size(), E . size() - 1 , 1 );
298
+ if (k > cnt) {
299
+ k -= cnt;
300
+ } else {
301
+ int idx = E . indexOf(x);
302
+ E . remove(idx);
303
+ ans. add(x);
304
+ ans. addAll(buildPermutation(1 , O , E , k, d));
305
+ return ans;
306
+ }
307
+ }
308
+ i++ ;
309
+ }
310
+ }
311
+ return ans;
312
+ }
313
+ }
314
+
315
+ class Solution {
316
+ public int [] permute (int n , long k ) {
317
+ int o = (n + 1 ) / 2 , e = n / 2 ;
318
+ ArrayList<Integer > O = new ArrayList<> (), E = new ArrayList<> ();
319
+
320
+ for (int i = 1 ; i <= n; i++ ) {
321
+ if (i % 2 == 1 ) O . add(i);
322
+ else E . add(i);
323
+ }
324
+
325
+ SortHelper s = new SortHelper ();
326
+ s. sortList(O );
327
+ s. sortList(E );
328
+
329
+ DPHelper d = new DPHelper ();
330
+ PermutationHelper ph = new PermutationHelper ();
331
+
332
+ long tot = 0 ;
333
+ if (n % 2 == 1 ) tot = d. compute(O . size() - 1 , E . size(), 0 ) * O . size();
334
+ else tot = d. compute(O . size() - 1 , E . size(), 0 ) * O . size() + d. compute(O . size(), E . size() - 1 , 1 ) * E . size();
335
+
336
+ if (k > tot) return new int [0 ];
337
+
338
+ List<Integer > res = ph. alternateFormation(O , E , k, d, n, s);
339
+ int [] ans = new int [res. size()];
340
+ for (int i = 0 ; i < res. size(); i++ ) ans[i] = res. get(i);
341
+
342
+ return ans;
343
+ }
344
+ }
118
345
```
119
346
120
347
#### C++
121
348
122
349
``` cpp
123
-
350
+ class Solution {
351
+ long long f[ 105] ;
352
+ public:
353
+ vector<int > permute(int n, long long k) {
354
+ int i,j;
355
+ for(i=f[ 0] =1;i<=n;i++)if(f[ i-1] >=k)f[ i] =k;
356
+ else f[ i] =f[ i-1] * (i+1>>1);
357
+ if(!(n&1))f[ n] * =2;
358
+ if(f[ n] <k)return {};
359
+ k--;
360
+ vector<int > ans(n),a[ 2] ;
361
+ for(i=0;i<n;i++)a[ i&1] .push_back(i);
362
+ if(n&1)
363
+ {
364
+ ans[ 0] =k/f[ n-1] * 2;
365
+ k-=ans[ 0] /2* f[ n-1] ;
366
+ }
367
+ else
368
+ {
369
+ ans[ 0] =k/f[ n-1] ;
370
+ k-=ans[ 0] * f[ n-1] ;
371
+ }
372
+ a[ ans[ 0] &1] .erase(lower_bound(a[ ans[ 0] &1] .begin(),a[ ans[ 0] &1] .end(),ans[ 0] ));
373
+ for(i=1;i<n;i++)
374
+ {
375
+ if(n&1)
376
+ {
377
+ ans[ i] =a[ i&1] [ k/f[ n-i-1]] ;
378
+ }
379
+ else
380
+ {
381
+ ans[ i] =a[ (ans[ 0] ^i)&1] [ k/f[ n-i-1]] ;
382
+ }
383
+ k%=f[ n-i-1] ;
384
+ a[ ans[ i] &1] .erase(lower_bound(a[ ans[ i] &1] .begin(),a[ ans[ i] &1] .end(),ans[ i] ));
385
+ }
386
+ for(i=0;i<n;i++)ans[ i] ++;
387
+ return ans;
388
+ }
389
+ };
124
390
```
125
391
126
392
#### Go
127
393
128
394
```go
129
-
395
+ func permute(n int, k int64) []int {
396
+ var f [105]int64
397
+ f[0] = 1
398
+ for i := 1; i <= n; i++ {
399
+ if f[i-1] >= k {
400
+ f[i] = k
401
+ } else {
402
+ f[i] = f[i-1] * int64((i+1)>>1)
403
+ }
404
+ }
405
+ if n%2 == 0 {
406
+ f[n] *= 2
407
+ }
408
+ if f[n] < k {
409
+ return []int{}
410
+ }
411
+ k--
412
+ ans := make([]int, n)
413
+ a := [2][]int{}
414
+ for i := 0; i < n; i++ {
415
+ a[i&1] = append(a[i&1], i)
416
+ }
417
+
418
+ if n%2 == 1 {
419
+ ans[0] = int(k/f[n-1]) * 2
420
+ k -= int64(ans[0]/2) * f[n-1]
421
+ } else {
422
+ ans[0] = int(k / f[n-1])
423
+ k -= int64(ans[0]) * f[n-1]
424
+ }
425
+
426
+ index := sort.SearchInts(a[ans[0]&1], ans[0])
427
+ a[ans[0]&1] = append(a[ans[0]&1][:index], a[ans[0]&1][index+1:]...)
428
+
429
+ for i := 1; i < n; i++ {
430
+ if n%2 == 1 {
431
+ ans[i] = a[i&1][k/f[n-i-1]]
432
+ } else {
433
+ ans[i] = a[(ans[0]^i)&1][k/f[n-i-1]]
434
+ }
435
+ k %= f[n-i-1]
436
+
437
+ index = sort.SearchInts(a[ans[i]&1], ans[i])
438
+ a[ans[i]&1] = append(a[ans[i]&1][:index], a[ans[i]&1][index+1:]...)
439
+ }
440
+
441
+ for i := 0; i < n; i++ {
442
+ ans[i]++
443
+ }
444
+ return ans
445
+ }
130
446
```
131
447
132
448
<!-- tabs: end -->
0 commit comments