Skip to content

Commit 5d7cca5

Browse files
Create solution.cpp
1 parent 7c6fb30 commit 5d7cca5

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed
Lines changed: 40 additions & 0 deletions
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+
};

0 commit comments

Comments
 (0)