File tree Expand file tree Collapse file tree 1 file changed +51
-0
lines changed
solution/3400-3499/3470.Permutations IV Expand file tree Collapse file tree 1 file changed +51
-0
lines changed Original file line number Diff line number Diff line change 1+ func permute (n int , k int64 ) []int {
2+ var f [105 ]int64
3+ f [0 ] = 1
4+ for i := 1 ; i <= n ; i ++ {
5+ if f [i - 1 ] >= k {
6+ f [i ] = k
7+ } else {
8+ f [i ] = f [i - 1 ] * int64 ((i + 1 )>> 1 )
9+ }
10+ }
11+ if n % 2 == 0 {
12+ f [n ] *= 2
13+ }
14+ if f [n ] < k {
15+ return []int {}
16+ }
17+ k --
18+ ans := make ([]int , n )
19+ a := [2 ][]int {}
20+ for i := 0 ; i < n ; i ++ {
21+ a [i & 1 ] = append (a [i & 1 ], i )
22+ }
23+
24+ if n % 2 == 1 {
25+ ans [0 ] = int (k / f [n - 1 ]) * 2
26+ k -= int64 (ans [0 ]/ 2 ) * f [n - 1 ]
27+ } else {
28+ ans [0 ] = int (k / f [n - 1 ])
29+ k -= int64 (ans [0 ]) * f [n - 1 ]
30+ }
31+
32+ index := sort .SearchInts (a [ans [0 ]& 1 ], ans [0 ])
33+ a [ans [0 ]& 1 ] = append (a [ans [0 ]& 1 ][:index ], a [ans [0 ]& 1 ][index + 1 :]... )
34+
35+ for i := 1 ; i < n ; i ++ {
36+ if n % 2 == 1 {
37+ ans [i ] = a [i & 1 ][k / f [n - i - 1 ]]
38+ } else {
39+ ans [i ] = a [(ans [0 ]^ i )& 1 ][k / f [n - i - 1 ]]
40+ }
41+ k %= f [n - i - 1 ]
42+
43+ index = sort .SearchInts (a [ans [i ]& 1 ], ans [i ])
44+ a [ans [i ]& 1 ] = append (a [ans [i ]& 1 ][:index ], a [ans [i ]& 1 ][index + 1 :]... )
45+ }
46+
47+ for i := 0 ; i < n ; i ++ {
48+ ans [i ]++
49+ }
50+ return ans
51+ }
You can’t perform that action at this time.
0 commit comments