#include<bits/stdc++.h>
using namespace std;
int factors[10] = {1,1,};
int ans[9] = {1,2,3,4,5,6,7,9,8};
// 康托展开得到的名次
int cantor(int n){
int p = 0;
for (int i=0;i<n;i++){
int smaller = 0; // 当前位置后小其的数
for (int j=n-1;j>i;j--)
if (ans[i]>ans[j])
smaller++;
p += smaller*factors[n-i-1];
}
return p+1;
}
// 逆康托
int recantor(int num){
num--;
int rest[10];
for (int i=1;i<=9;i++)
rest[i] = i;
int n=num;
for (int i=0;i<n;i++){
int t = num/factors[n-i-1];
num %= factors[n-i-1];
for (int j = t+1;j<n;j++)
if (rest[j]){
ans[i] = rest[j];
rest[j] = 0;
}
}
}
// 阶乘
int factor(int num){
factors[num] = num*factors[num-1];
}
int main(){
// 得到1->9的阶乘
for (int i=2;i<=9;i++)
factor(i);
int place = cantor(9);
cout<<place<<endl;
recantor(place);
for (int i=0;i<9;i++)
cout<<ans[i];
}
作用:节约空间
后续完善,想的踢我