1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
use std::collections::HashMap;
fn get_permutation(n: usize, mut k: u64) -> Vec<usize> {
fn count(odd: usize, even: usize, last: usize, memo: &mut HashMap<(usize, usize, usize), u64>) -> u64 {
if odd + even == 0 { return 1; }
if let Some(&v) = memo.get(&(odd, even, last)) { return v; }
let mut res = 0;
if last == 0 && even > 0 { res += count(odd, even-1, 1, memo); }
if last == 1 && odd > 0 { res += count(odd-1, even, 0, memo); }
memo.insert((odd, even, last), res);
res
}
let mut odds: Vec<usize> = (1..=n).filter(|&x| x%2==1).collect();
let mut evens: Vec<usize> = (1..=n).filter(|&x| x%2==0).collect();
for first in 0..2 {
let (odd, even) = (odds.len(), evens.len());
if (first == 0 && even == 0) || (first == 1 && odd == 0) { continue; }
let mut memo = HashMap::new();
let cnt = if first == 0 { count(odd, even-1, 1, &mut memo) } else { count(odd-1, even, 0, &mut memo) };
if k > cnt { k -= cnt; continue; }
let (mut o, mut e) = (odds.clone(), evens.clone());
let mut res = vec![];
let mut last = first;
for _ in 0..n {
let pool = if last == 1 { &mut o } else { &mut e };
pool.sort();
for j in 0..pool.len() {
let v = pool[j];
let (no, ne) = (o.len(), e.len());
let (no, ne) = if last == 1 { (no-1, ne) } else { (no, ne-1) };
let cnt2 = count(no, ne, 1-last, &mut memo);
if k > cnt2 { k -= cnt2; continue; }
res.push(v);
pool.remove(j);
last = 1-last;
break;
}
}
return res;
}
vec![]
}
|