康拓展開一般是用於計算乙個全排列數字排在所有全排列的大小位置。
那麼到底怎麼計算呢?
敲重點
x=a[n]∗(n-1)!+a[n-1]∗(n-2)!+…+a[i]*(i-1)!+…+a[2]*1!+a[1]*0![1]
從第乙個數字開始到倒數第二個數字,計算需要計算的那個數字之後比這個數小的數字有幾個,再乘以(n-x)!,n是全排列的
數字,x是當前數字的位置。
下面就是**。
#include
using namespace std;
int fac=
;//提前預處理階乘的值
intmain()
res++
; cout
}
康拓展開的逆,就是根據康拓展開來進行逆運算,已知n的全排列,和第幾大的全排列,得到具體的全排列值。
#include
using namespace std;
int fac=
;//提前預處理階乘的值
vector<
int> vis,res;
//記錄還剩下幾個數可以填 ,result
intmain()
for(
int i=
0;isize()
;i++
) cout<; cout
}
下面來一道簡單的例題
swust oj 437題
數字全排列
1000 (ms) 65535 (kb) 1071 / 3466
從1〜9之間順序取ñ個數字,組成每位數不重複的所有可能的ñ位數,按從小到大的順序進行編號,當輸入其中的任何乙個數中號是,能找出該數對應的編號。如:當n = 3,m = 132時,則輸出:[123(1),132(2),213(3),231(4),312(5),321(6)] - > x = 2
輸入輸入只有一行,兩個正整數n和m(1≤n≤9,1≤k≤987654321),之間用乙個空格分隔開。
輸出輸出對應的編號x.
樣例輸入
3 132
樣例輸出
2下面給出ac**
#include
using namespace std;
int fac=
;int
main()
res++
; cout
}
康拓展開與逆康拓展開
首先解釋一下,所謂的康拓展開,就是能夠通過乙個式子,得到乙個排列在所有排列中的按字典序排好後的位次。而逆康托展開,則是給出排列的位次,能夠計算出排列是什麼。下面先給出康拓展開的公式 其中ai 為整數,並且 0 ai ai表示原數的第 i位在當前未出現的元素中是排在第幾個 康拓展開是乙個雙射,因此常用...
康拓展開和逆康拓展開
康托展開就是一種特殊的雜湊函式 把乙個整數x展開成如下形式 x a n n a n 1 n 1 a 2 2 a 1 1 其中,a為整數,並且0 a表示1,2,3,n的排列如 按從小到大排列一共6種,就是123 132 213 231 312 321 代表的數字 1 2 3 4 5 6 也就是把10進...
康拓展開和逆康拓展開
康拓展開模板題 複雜度o n 2 的會tle 看資料就知道了 雖然某題解說可以,不知道是不是後期加強了資料 然而我還是寫了o n 2 的 include typedef long long ll ll f 1000010 const ll mod 998244353 int a 1000010 b ...