Skip to content

Commit f84be24

Browse files
Update README_EN.md
1 parent 3ddb8f4 commit f84be24

File tree

1 file changed

+320
-4
lines changed

1 file changed

+320
-4
lines changed

solution/3400-3499/3470.Permutations IV/README_EN.md

Lines changed: 320 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)