首页 > 代码库 > 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