時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:3描述
現在有"abcdefghijkl」12個字元,將其按字典序排列,如果給出任意一種排列,我們能說出這個排列在所有的排列中是第幾小的。但是現在我們給出它是第幾小,需要你求出它所代表的序列.輸入
第一行有乙個整數n(0
輸出輸出乙個序列,佔一行,代表著第m小的序列。
樣例輸入
31302715242
260726926
樣例輸出
abcdefghijklhgebkflacdji
gfkedhjblcia
**[路過這]原創
典型的康拓逆展開問題,還是依照x=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!這個公式,但是這次是倒著來的,給出了x,需要求出來an,a(n-1).....a2,a1,跟以前學的解方程一樣,多元一次方程,有很多解,但是在這裡符合條件0<=an<12的只有一組解,在這裡先找一組數試試吧,例如:
(1)找出第
96個數
1.、首先用96-1得到
95 //
首先減一,是因為題意為第幾個數,而康拓展開所得是有多少個比本身小的數列個數,減一正好。
2、用95去除
4! 得到3餘
23//相當於
x除以(
n-1)!得
3餘a[ n ],
a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!
.。有3個數比它小的數是4,
所以第一位是4
3、用23去除
3! 得到3餘
5,有3個數比它小的數是4但
4已經在之前出現過了所以第二位是5(
4在之前出現過,所以實際比
5小的數是3個)
4、用5去除
2!得到2餘
1,有2個數比它小的數是
3,第三位是35、
用1去除
1!得到1餘
0,有1個數比它小的數是
2,第二位是26、
最後乙個數只能是1
所以這個數是45321
同理程式是這樣的
#include#includeint main();//存階乘
for(int i=2;i<=15;i++)
char str[12]=;//對應輸出
char str1[12];
int n,temp; //temp用來記錄第i個數在當前未出現的元素中排第幾位(從0開始)
long long m;
scanf("%d",&n);
while(n--)
printf("\n");
} 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 139 我排第幾 143 第幾是誰
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入2 abcd...