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