首页 > 代码库 > POJ 1715
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;}
POJ 1715
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。