@@ -108,25 +108,341 @@ tags:
108108#### Python3
109109
110110``` 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
112183```
113184
114185#### Java
115186
116187``` 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+ }
118345```
119346
120347#### C++
121348
122349``` 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+ };
124390```
125391
126392#### Go
127393
128394```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+ }
130446```
131447
132448<!-- tabs: end -->
0 commit comments