1. 程式人生 > >康托展開

康托展開

似的 問題 int 一個數 康托展開 isp play 簡潔 一位

按規矩,祭天

今天加了的內容是康托展開,因為時間原因就不附上題目了而且我也還沒有做題,就直接來看內容了

定義

它是用來求解一個數列的全排列下面的結果的序號的問題
\[ ∑(pi*(n-i)!)(i是第幾個數字) \]

逆推過去

那麽就是根據序號求結果了,方法是類似的
首先是把1~n-1的階乘都算出來,然後呢每一位也是倒著回去,用序號整除這裏對應的階乘,然後看看在剩下的沒有選的數字當中哪一個的比它小的數字的個數等於這一個結果就行了

比較簡潔,大概就是我對此的理解了

最後還有一個逆元的求法

這個求法的推導自己去推,書上也是有的(數學一本通P17)
那麽我就附上一份代碼就行了

int inv(int n,int p){
    if(n==1)return 1;
    else return -(p/i)*inv(p%n,p);
}

到此為止了。

康托展開