nyoj139 我排第幾個(康拓展開)

2021-08-07 23:38:55 字數 1092 閱讀 2004

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3描述

現在有"abcdefghijkl」12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?

輸入

第一行有乙個整數n(0

輸出輸出乙個整數m,佔一行,m表示排列是第幾位;

樣例輸入

3

abcdefghijkl

hgebkflacdji

gfkedhjblcia

樣例輸出

1

302715242

260726926

x=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! ,其中a[i]為當前未出現的元素中是排在第幾個(從0開始)。這就是康托展開。所得結果x是一共有x個比當前所給的排列小的排列個數

如我想知道321是中第幾個小的數可以這樣考慮 :

第一位是3,當第一位的數小於3時,那

排列數小於321 如 123、 213 ,小於3的數有1、2 。(也可以像定義那樣理解,3前面有1、2,從0為下標開始排位3是第2位)所以有2*2!個。再看小於第二位2的:小於2的數只有乙個就是1 ,所以有1*1!=1 所以小於321的排列數有2*2!+1*1!=5個。所以321是第6個小的數。 2*2!+1*1!+0*0!就是康托展開。

例: 1324是排列數中第幾個大的數:

第一位是1小於1的數沒有,是0個 0*3! 第二位是3小於3的數有1和2,但1已經在第一位了(前面以出現過1,所以不記),所以只有乙個數2 1*2! 。第三位是2小於2的數是1,但1在第一位,所以有0個數 0*1! ,所以比1324小的排列有0*3!+1*2!+0*1!+0*0!=2個,1324是第三個小數。

#include#include#include#includeusing namespace std;

int main()

printf("%lld\n",sum+1);//問的是排第幾,最後加 1

} return 0;

}

nyoj 139 我排第幾個(康托展開)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入 第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入 3 ab...

NYOJ 139 我排第幾個(康托展開)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入 3 abcd...

nyoj 139 我排第幾個 數學 康托展開

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入 第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入 3 ab...