康拓展開 康拓逆展開

2021-08-20 19:37:59 字數 787 閱讀 3268

康拓展開

已知有一集合a包含n個不同的元素,其中(k1,k2,k3...,kn-2 )是a的乙個排列。假設此排列為a按字典序從小到大排列的排列中的第x個排列,則x=a1(n-1)!+a2(n-2)!+...an-2*1!+an-1*0!(其中ai為ki+1...kn中比ki小的數的個數)

例如:3214是1234的第2*3! +1*2! +0*1! +0*0! =14個排列。

實現**:

int cantos()}}

}for(int i=1;i<=n;i++);

bool b[362885],used[11];

struct data;

queueq;

int can()

s=can();//起始狀態編號

b[s]=1;

q.push((data));

for(int i=1;i<=9;i++)

t=can();//目標狀態編號

bool flag=0;

while(!q.empty())

b[bian]=1;

q.push((data));

a[now]^=a[nx];

a[nx]^=a[now];

a[now]^=a[nx];}}

}if(!flag)cout<<"-1";

return 0;

}

看不懂位運算的點這裡~

康拓展開與康拓逆展開

x a n n 1 a n 1 n 2 a i i 1 a 1 0 其中a i 為當前未出現的元素中是排在第幾個 從0開始 這就是康托展開。公式把乙個整數x展開成如下形式 x a n n 1 a n 1 n 2 a i i 1 a 2 1 a 1 0 其中a 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進...

康拓展開與逆康拓展開

首先解釋一下,所謂的康拓展開,就是能夠通過乙個式子,得到乙個排列在所有排列中的按字典序排好後的位次。而逆康托展開,則是給出排列的位次,能夠計算出排列是什麼。下面先給出康拓展開的公式 其中ai 為整數,並且 0 ai ai表示原數的第 i位在當前未出現的元素中是排在第幾個 康拓展開是乙個雙射,因此常用...