国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

nyoj 143 第幾是誰(康拓展開的逆運算)

2019-11-08 02:23:48
字體:
來源:轉載
供稿:網友

第幾是誰?

時間限制:3000 ms  |  內存限制:65535 KB難度:3描述現在有"abcdefghijkl”12個字符,將其按字典序排列,如果給出任意一種排列,我們能說出這個排列在所有的排列中是第幾小的。但是現在我們給出它是第幾小,需要你求出它所代表的序列.輸入第一行有一個整數n(0<n<=10000);隨后有n行,每行是一個整數m,它代表著序列的第幾小;輸出輸出一個序列,占一行,代表著第m小的序列。樣例輸入
31302715242260726926樣例輸出
abcdefghijklhgebkflacdjigfkedhjblcia

AC代碼如下:

#include<cstdio>#include<cstring>using namespace std;const int maxn=12+2;char a[]="abcdefghijkl";char b[maxn];int stratum(int n){	int sum=1;	for(int i=1;i<=n;i++){		sum*=i;	}	return sum;}void cantor(int t){	int c[maxn];	memset(c,0,sizeof(c));	for(int i=0;i<12;i++){		int temp=t/stratum(11-i);     //比當前位小的個數 		for(int j=0;j<=temp;j++) 			if(c[j])temp++;		c[temp]=1;		b[i]=a[temp];		t%=stratum(11-i);	}}int main(){	int n;	scanf("%d",&n);	while(n--){		int tmp;		scanf("%d",&tmp);		cantor(tmp-1);		for(int i=0;i<12;i++)		PRintf("%c",b[i]);		printf("/n");	}	return 0;} 

如何判斷給定一個位置,輸出該位置上的數列,康拓展開的逆運算,例如:  {1,2,3,4,5}的全排列,并且已經從小到大排序完畢,請找出第96個數:    首先用96-1得到95   用95去除4! 得到3余23,即有3個數比該數位上的數字小,則該數位的數字為4;   用23去除3! 得到3余5,即有3個數比該數位上的數字小,理應為4,但4已在前面的高位中出現過,所以該數位的數字為5;   用5去除2!得到2余1,即有2個數比該數位上的數字小,則該數位的數字為3;   用1去除1!得到1余0,即有1個數比該數位上的數字小,則該數位的數字為2;   最后一個數只能是1;   所以這個數是45321


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湘阴县| 卢龙县| 辽宁省| 桐城市| 连城县| 杭锦旗| 隆安县| 高雄县| 常宁市| 盐山县| 海门市| 宁城县| 澳门| 绥德县| 通许县| 乡宁县| 阳曲县| 耿马| 富民县| 咸宁市| 疏附县| 上栗县| 县级市| 贺州市| 湾仔区| 铜山县| 瑞金市| 康定县| 平顶山市| 奉节县| 定日县| 崇左市| 台南县| 广元市| 崇义县| 丰原市| 上虞市| 娱乐| 濮阳县| 扎囊县| 惠水县|