国产探花免费观看_亚洲丰满少妇自慰呻吟_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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鲜城| 探索| 祁门县| 武宁县| 惠东县| 驻马店市| 新化县| 阿拉尔市| 磐石市| 丹棱县| 阳春市| 黎平县| 都匀市| 上饶县| 池州市| 西吉县| 云阳县| 崇左市| 临沭县| 东丽区| 团风县| 油尖旺区| 大冶市| 淅川县| 乃东县| 温泉县| 巴林右旗| 武宁县| 伊春市| 呼伦贝尔市| 金湖县| 兴城市| 抚顺县| 周宁县| 农安县| 漳浦县| 红安县| 阳新县| 西乌珠穆沁旗| 正定县| 望都县|