POJ 1715
同样是确定某位上的数,当确定某一位后,其后面的排列数是确定的,所以可以用除法和取余数的方法来确定这一位的值
#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; }