時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:3
描述
現在有"abcdefghijkl」12個字元,將其按字典序排列,如果給出任意一種排列,我們能說出這個排列在所有的排列中是第幾小的。但是現在我們給出它是第幾小,需要你求出它所代表的序列.
輸入
第一行有乙個整數n(0
輸出輸出乙個序列,佔一行,代表著第m小的序列。
樣例輸入
31302715242
260726926
樣例輸出
abcdefghijklhgebkflacdji
gfkedhjblcia
#include
#include
long int fac[13] = ;
char s[12];
int a[12];
void find(int len, int n);
int main()
return 0;
}void find(int len, int n)
i = 0;
while(a[i])//最後剩下的就是最後乙個;
i++;
s[len - 1] = i + 97;
}
題目:給出n個互不相同的字元, 並給定它們的相對大小順序,這樣n個字元的所有排列也會有乙個順序. 現在任給乙個排列,求出在它後面的第i個排列.
這是乙個典型的康拓展開應用,首先我們先闡述一下什麼是康拓展開。
(1)康拓展開
所謂康拓展開是指把乙個整數x展開成如下形式:
x=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0!。(其中,a為整數,並且0<=a[i]
2 using namespace std;
3 4 int cantor(int *s,int n); //康托展開,判斷給定的排列位於全排列中的第幾個
5 long int fac=; //表示階乘運算的結果
6 //long int fac=;
7 8 int main(int argc,char *argv)
9 ; //表示排列2134
11 int len=4; //表示數列中數字數目
12 int index=cantor(s,len);
13 cout<
2 using namespace std;
3 4 void cantorreverse(int index,int *p,int n); //康托展開逆用,判斷給定的位置中的排列
5 long int fac=; //表示階乘運算的結果
6 //long int fac=;
7 8 int main(int argc,char *argv)
9 組成的所有排列中,求出第96個排列的順序
13 for(int i=0;i
上面網上找的康拓展開的解釋
康拓展開逆運算:
#include
char s[5] = ;
int a[5];
int fac[100] = ;
void find(int num, int len);
int main()
void find(int num, int len)
else}}
自己嘗試:
康拓展開:
#include
int fac[100] = ;
int main()
;len = 3;
num = 0;
for(i = 0; i < len; i++)
printf("%d\n",num);
return 0;
}
nyoj 143 第幾是誰?
時間限制 3000 ms 記憶體限制 65535 kb 難度 3描述 現在有 abcdefghijkl 12個字元,將其按字典序排列,如果給出任意一種排列,我們能說出這個排列在所有的排列中是第幾小的。但是現在我們給出它是第幾小,需要你求出它所代表的序列.輸入 第一行有乙個整數n 0 輸出輸出乙個序列...
NYOJ 143第幾是誰
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述現在有 abcdefghijkl 12個字元,將其按字典序排列,如果給出任意一種排列,我們能說出這個排列在所有的排列中是第幾小的。但是現在我們給出它是第幾小,需要你求出它所代表的序列.輸入第一行有乙個整數n 0輸出 輸出乙個序列,...
NYOJ 143 第幾是誰?
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現在有 abcdefghijkl 12個字元,將其按字典序排列,如果給出任意一種排列,我們能說出這個排列在所有的排列中是第幾小的。但是現在我們給出它是第幾小,需要你求出它所代表的序列.輸入 第一行有乙個整數n 0 輸出輸出乙個序...