Ignatius and the Princess II - http://acm.hdu.edu.cn/showproblem.php?pid=1027
代码
next_permutation
#include<bits/stdc++.h>
using namespace std;
#define MXN 1010
int N, M, n[MXN];
int main(){
while(scanf("%d%d", &N, &M) == 2){
for(int i = 1; i <= N; i++) n[i] = i;
M--;
while(M--) next_permutation(n+1, n+N+1);
// printf("%d", n[1]);
// for(int i = 2; i <= N; i++) printf(" %d", n[i]);
// printf("\n");
for(int i = 1; i < N ; i++) printf("%d ", n[i]);
printf("%d\n",n[N]);
}
return 0;
}
康托逆展开
#include <bits/stdc++.h>
using namespace std;
vector<int>vec;
vector<int>ans;
int f[20],n,m;
void rev_kangtuo(int k){
int n=vec.size(),len=0;
ans.clear();
k--;
for (int i=1;i<=n;i++){
int t;
if (n-i>10)t=0;
else t=k/f[n-i],k%=f[n-i];
ans.push_back(vec[t]);
vec.erase(vec.begin()+t);
}
}
int main() {
f[0]=1;
for (int i=1;i<=10;i++)f[i]=f[i-1]*i;
while (~scanf("%d%d",&n,&m)){
for (int i=1;i<=n;i++)vec.push_back(i);
rev_kangtuo(m);
for (int i=0;i<ans.size();i++){
if (i==ans.size()-1)printf("%d\n",ans[i]);
else printf("%d ",ans[i]);
}
}
return 0;
}
// hdu 1027 Ignatius and the Princess II
#include<bits/stdc++.h>
using namespace std;
#define MXN 1010
#define MXF 8
int N, M, ans[MXN], f[MXF]={1};
int main(){
for(int i = 1; i < MXF; i++) f[i] = f[i-1]*i;
while(scanf("%d %d", &N, &M) == 2){
for(int i = 1; i <= N; i++) ans[i] = i;
int *pt = ans + N - min(MXF-1, N-1), p, tmp;
M--;
for(int i = min(MXF-1, N-1); i >= 0; i--){
p = M / f[i];
M %= f[i];
tmp = pt[p];
for(int j = p; j >= 1; j--)
pt[j] = pt[j-1];
pt[0] = tmp;
pt++;
}
for(int i = 1; i < N; i++) printf("%d ", ans[i]);
printf("%d\n", ans[N]);
}
return 0;
}