Skip to content

Commit 44776a5

Browse files
Add files via upload
1 parent 4f2027d commit 44776a5

File tree

4 files changed

+320
-0
lines changed

4 files changed

+320
-0
lines changed

Diff for: solution/3400-3499/3470.Permutations IV/solution.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
class Solution {
2+
long long f[105];
3+
public:
4+
vector<int> permute(int n, long long k) {
5+
int i,j;
6+
for(i=f[0]=1;i<=n;i++)if(f[i-1]>=k)f[i]=k;
7+
else f[i]=f[i-1]*(i+1>>1);
8+
if(!(n&1))f[n]*=2;
9+
if(f[n]<k)return {};
10+
k--;
11+
vector<int> ans(n),a[2];
12+
for(i=0;i<n;i++)a[i&1].push_back(i);
13+
if(n&1)
14+
{
15+
ans[0]=k/f[n-1]*2;
16+
k-=ans[0]/2*f[n-1];
17+
}
18+
else
19+
{
20+
ans[0]=k/f[n-1];
21+
k-=ans[0]*f[n-1];
22+
}
23+
a[ans[0]&1].erase(lower_bound(a[ans[0]&1].begin(),a[ans[0]&1].end(),ans[0]));
24+
for(i=1;i<n;i++)
25+
{
26+
if(n&1)
27+
{
28+
ans[i]=a[i&1][k/f[n-i-1]];
29+
}
30+
else
31+
{
32+
ans[i]=a[(ans[0]^i)&1][k/f[n-i-1]];
33+
}
34+
k%=f[n-i-1];
35+
a[ans[i]&1].erase(lower_bound(a[ans[i]&1].begin(),a[ans[i]&1].end(),ans[i]));
36+
}
37+
for(i=0;i<n;i++)ans[i]++;
38+
return ans;
39+
}
40+
};

Diff for: solution/3400-3499/3470.Permutations IV/solution.go

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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+
}
+157
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
import java.util.*;
2+
3+
class DPHelper {
4+
static final long ok = 10000000000000000L;
5+
long[][][] dp = new long[101][101][2];
6+
boolean[][][] vis = new boolean[101][101][2];
7+
8+
long compute(int o, int e, int p) {
9+
if (o == 0 && e == 0) return 1;
10+
if (vis[o][e][p]) return dp[o][e][p];
11+
12+
long r = 0;
13+
if (p == 1) {
14+
if (o == 0) r = 0;
15+
else r = o * compute(o - 1, e, 0);
16+
} else {
17+
if (e == 0) r = 0;
18+
else r = e * compute(o, e - 1, 1);
19+
}
20+
21+
if (r > ok) r = ok;
22+
vis[o][e][p] = true;
23+
dp[o][e][p] = r;
24+
return r;
25+
}
26+
}
27+
28+
class SortHelper {
29+
void sortList(ArrayList<Integer> list) {
30+
Collections.sort(list);
31+
}
32+
}
33+
34+
class PermutationHelper {
35+
List<Integer> buildPermutation(int p, ArrayList<Integer> O, ArrayList<Integer> E, long k, DPHelper d) {
36+
List<Integer> ans = new ArrayList<>();
37+
if (O.size() + E.size() == 0) return ans;
38+
int i = 0;
39+
40+
if (p == 1) {
41+
while (i < O.size()) {
42+
long cnt = d.compute(O.size() - 1, E.size(), 0);
43+
if (k > cnt) {
44+
k -= cnt;
45+
i++;
46+
} else {
47+
int x = O.get(i);
48+
O.remove(i);
49+
ans.add(x);
50+
ans.addAll(buildPermutation(0, O, E, k, d));
51+
return ans;
52+
}
53+
}
54+
} else {
55+
while (i < E.size()) {
56+
long cnt = d.compute(O.size(), E.size() - 1, 1);
57+
if (k > cnt) {
58+
k -= cnt;
59+
i++;
60+
} else {
61+
int x = E.get(i);
62+
E.remove(i);
63+
ans.add(x);
64+
ans.addAll(buildPermutation(1, O, E, k, d));
65+
return ans;
66+
}
67+
}
68+
}
69+
return ans;
70+
}
71+
72+
List<Integer> alternateFormation(ArrayList<Integer> O, ArrayList<Integer> E, long k, DPHelper d, int n, SortHelper s) {
73+
List<Integer> ans = new ArrayList<>();
74+
int tot = O.size() + E.size();
75+
if (tot % 2 == 1) {
76+
int i = 0;
77+
while (i < O.size()) {
78+
long cnt = d.compute(O.size() - 1, E.size(), 0);
79+
if (k > cnt) {
80+
k -= cnt;
81+
} else {
82+
int x = O.get(i);
83+
O.remove(i);
84+
ans.add(x);
85+
ans.addAll(buildPermutation(0, O, E, k, d));
86+
return ans;
87+
}
88+
i++;
89+
}
90+
} else {
91+
ArrayList<Integer> U = new ArrayList<>();
92+
U.addAll(O);
93+
U.addAll(E);
94+
s.sortList(U);
95+
int i = 0;
96+
while (i < U.size()) {
97+
int x = U.get(i);
98+
if (O.contains(x)) {
99+
long cnt = d.compute(O.size() - 1, E.size(), 0);
100+
if (k > cnt) {
101+
k -= cnt;
102+
} else {
103+
int idx = O.indexOf(x);
104+
O.remove(idx);
105+
ans.add(x);
106+
ans.addAll(buildPermutation(0, O, E, k, d));
107+
return ans;
108+
}
109+
} else {
110+
long cnt = d.compute(O.size(), E.size() - 1, 1);
111+
if (k > cnt) {
112+
k -= cnt;
113+
} else {
114+
int idx = E.indexOf(x);
115+
E.remove(idx);
116+
ans.add(x);
117+
ans.addAll(buildPermutation(1, O, E, k, d));
118+
return ans;
119+
}
120+
}
121+
i++;
122+
}
123+
}
124+
return ans;
125+
}
126+
}
127+
128+
class Solution {
129+
public int[] permute(int n, long k) {
130+
int o = (n + 1) / 2, e = n / 2;
131+
ArrayList<Integer> O = new ArrayList<>(), E = new ArrayList<>();
132+
133+
for (int i = 1; i <= n; i++) {
134+
if (i % 2 == 1) O.add(i);
135+
else E.add(i);
136+
}
137+
138+
SortHelper s = new SortHelper();
139+
s.sortList(O);
140+
s.sortList(E);
141+
142+
DPHelper d = new DPHelper();
143+
PermutationHelper ph = new PermutationHelper();
144+
145+
long tot = 0;
146+
if (n % 2 == 1) tot = d.compute(O.size() - 1, E.size(), 0) * O.size();
147+
else tot = d.compute(O.size() - 1, E.size(), 0) * O.size() + d.compute(O.size(), E.size() - 1, 1) * E.size();
148+
149+
if (k > tot) return new int[0];
150+
151+
List<Integer> res = ph.alternateFormation(O, E, k, d, n, s);
152+
int[] ans = new int[res.size()];
153+
for (int i = 0; i < res.size(); i++) ans[i] = res.get(i);
154+
155+
return ans;
156+
}
157+
}

Diff for: solution/3400-3499/3470.Permutations IV/solution.py

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from typing import List
2+
from math import factorial
3+
import heapq
4+
5+
class Solution:
6+
def permute(self, xxy: int, yyz: int) -> List[int]:
7+
8+
kasu = {}
9+
nnss = []
10+
majs = []
11+
ajwi = heapq.heappush
12+
laoq = []
13+
14+
zzp = [i for i in range(1, xxy + 1) if i % 2 == 1]
15+
zzq = [i for i in range(1, xxy + 1) if i % 2 == 0]
16+
17+
ppp = []
18+
nxr = None
19+
20+
for pps in range(xxy):
21+
if pps == 0:
22+
cnd = sorted(zzp + zzq)
23+
else:
24+
cnd = zzp if nxr == 1 else zzq
25+
26+
fff = False
27+
for cndt in cnd:
28+
if cndt % 2 == 1:
29+
nxt = 0
30+
noo = len(zzp) - 1
31+
nee = len(zzq)
32+
else:
33+
nxt = 1
34+
noo = len(zzp)
35+
nee = len(zzq) - 1
36+
37+
llq = noo + nee
38+
if llq == 0:
39+
cnt = 1
40+
else:
41+
if nxt == 1:
42+
if noo != (llq + 1) // 2 or nee != llq // 2:
43+
cnt = 0
44+
else:
45+
cnt = factorial(noo) * factorial(nee)
46+
else:
47+
if nee != (llq + 1) // 2 or noo != llq // 2:
48+
cnt = 0
49+
else:
50+
cnt = factorial(noo) * factorial(nee)
51+
52+
ajwi(nnss, cnt)
53+
ajwi(majs, llq)
54+
55+
if cnt >= yyz:
56+
ppp.append(cndt)
57+
if cndt % 2 == 1:
58+
zzp.remove(cndt)
59+
nxr = 0
60+
else:
61+
zzq.remove(cndt)
62+
nxr = 1
63+
fff = True
64+
break
65+
else:
66+
yyz -= cnt
67+
68+
ajwi(laoq, len(ppp))
69+
70+
if not fff:
71+
return []
72+
return ppp

0 commit comments

Comments
 (0)