時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:3 描述
現在有"abcdefghijkl」12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?
輸入
第一行有乙個整數n(0
輸出輸出乙個整數m,佔一行,m表示排列是第幾位;
樣例輸入
3abcdefghijkl
hgebkflacdji
gfkedhjblcia
樣例輸出
1302715242
260726926
**[苗棟棟]原創
上傳者
苗棟棟想法:
康托展開
表示1,2,3,...,n的排列如 按從小到大排列一共6個。123 132 213 231 312 321 。他們間的對應關係可由康托展開來找到。代表的數字 1 2 3 4 5 6 也就是把10進製數與乙個排列對應起來。他們間的對應關係可由康托展開來找到。
如我想知道321是中第幾個大的數可以這樣考慮 :
第一位是3,當第一位的數小於3時,那排列數小於321 如 123、 213 ,小於3的數有1、2 。所以有2*2!個。再看小於第二位2的:小於2的數只有乙個就是1 ,所以有1*1!=1 所以小於321的排列數有2*2!+1*1!=5個。所以321是第6個大的數。 2*2!+1*1!+1*0!是康托展開。
再舉個例子:1324是排列數中第幾個大的數:第一位是1小於1的數沒有,是0個 0*3! 第二位是3小於3的數有1和2,但1已經在第一位了,所以只有乙個數2 1*2! 。第三位是2小於2的數是1,但1在第一位,所以有0個數 0*1! ,所以比1324小的排列有0*3!+1*2!+0*1!=2個,1324是第三個大數。
把乙個整數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]
**:
#include
#include
int a[15];
char s[15];
int main()
int n;
scanf("%d",&n);
while(n--)
sum=sum+count*a[12-i-1];
}printf("%lld\n",sum+1);
}return 0;}
南陽ACM 我排第幾個
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入 第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入 3 ab...
139 我排第幾個
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入 第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入 3 ab...
南陽理工OJ 139 我排第幾個(康拓展開)
描述現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入 第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入 3 abcdefghijkl hgebkflacdji gfkedhjblc...