同样是确定某位上的数,当确定某一位后,其后面的排列数是确定的,所以可以用除法和取余数的方法来确定这一位的值
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int lim[10];
bool vis[20];
int ans[20],ansl;
void initial(){
lim[9]=0;
lim[8]=486486000;
lim[7]=540540000;
lim[6]=545945400;
lim[5]=546436800;
lim[4]=546477750;
lim[3]=546480900;
lim[2]=546481125;
lim[1]=546481140;
}
int judge(int &n){
for(int i=8;i>=1;i--){
if(n<=lim[i]){
n=n-lim[i+1];
return i;
}
}
}
int getnum(int bt,int hw){
int sum=1;
for(int i=hw;i>0;i--){
sum=sum*bt;
bt--;
}
return sum;
}
void enAns(int w){
for(int i=15;i>=0;i--){
if(w==0){
if(!vis[i]){
ans[ansl++]=i;
vis[i]=true;
return ;
}
else{
continue;
}
}
else{
if(!vis[i]){
w--;
}
else{
continue;
}
}
}
}
void work(int num,int hw){
int bt=16;
int tmp,word;
for(int i=hw-1;i>=0;i--){
bt--;
tmp=getnum(bt,i);
word=num/tmp;
// cout<<word<<endl;
num%=tmp;
enAns(word);
}
}
int main(){
initial();
int n;
while(scanf("%d",&n)!=EOF){
memset(vis,false,sizeof(vis));
ansl=0;
if(n==546481141){
printf("0\n");
continue;
}
int hw=judge(n);
n--;
// cout<<hw<<endl;
work(n,hw);
for(int i=0;i<ansl;i++){
if(ans[i]>=10){
printf("%c",ans[i]-10+'A');
}
else printf("%c",ans[i]+'0');
}
printf("\n");
}
return 0;
}