時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:3描述
現在有"abcdefghijkl」12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?
輸入
第一行有乙個整數n(0
輸出輸出乙個整數m,佔一行,m表示排列是第幾位;
樣例輸入
3abcdefghijkl
hgebkflacdji
gfkedhjblcia
樣例輸出
1302715242
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...