錯位排序公式及理解

2021-07-12 02:32:20 字數 1166 閱讀 6966

今天集訓問錯排是什麼被hszx教練嘲諷了,痛下決心學一下竟然還挺簡單的

錯位排序遞推公式:

設f[i]為i個數錯位排序 (任意1<=i<=n a[i]!=i)

f[0]=1,f[1]=0;

f[i]=(f[i-1]*f[i-2])*(i-1)  (i>=2)

公式理解:

情況1:插入第i個元素時,前i-1個已經錯位排好,則選擇其中任意乙個與第i個互換一定滿足要求,選擇方法共i-1種,前i-1位錯排f[i-1]種,記f[i-1]*(i-1)

情況2:插入第i個元素時,前i-1個中恰有乙個元素a[j]使得a[j]=j,其他i-2個錯位排好,則將i與j交換,j在i-2位中的插入共i-1種,前i-2位錯排f[i-2]種,記f[i-2]*(i-1)

以上兩種情況求和可得

f[i]=(f[i-1]*f[i-2])*(i-1)  (i>=2)

遞推**

long long cp[maxn];

inline void get_cp()

模板題:bzoj4517

附**(寫慢了,不預處理階乘逆元能降乙個log qaq)

#include#include#include#includeusing namespace std;

#define maxn 1000005

#define mod 1000000007

int n=maxn,m,t;

long long stair[maxn];

long long invs[maxn];

long long cp[maxn];

long long ans[maxn];

inline long long qpow(long long b,long long t)

return ans;

}inline long long inv(long long x)

inline void init()

cp[0]=1ll;

for(int i=2;i<=n;i++)

cp[i]=(i-1)*(cp[i-2]+cp[i-1])%mod;

}inline long long comb(int a,int b)

int main()

}

全錯位排序公式推導

全錯位排列被著名數學家尤拉 leonhard euler,1707 1783 稱為 組合數論的乙個妙題 的 裝錯信封問題 的兩個特例。裝錯信封問題 是由當時最有名的數學家約翰 伯努利 johann bernoulli,1667 1748 的兒子丹尼爾 伯努利 danidbernoulli,1700 ...

組合數學 全錯位排序公式

problem description 大家常常感慨,要做好一件事情真的不容易,確實,失敗比成功容易多了!做好 一件 事情尚且不易,若想永遠成功而總從不失敗,那更是難上加難了,就像花錢總是比掙錢容易的道理一樣。話雖這樣說,我還是要告訴大家,要想失敗到一定程度也是不容易的。比如,我高中的時候,就有乙個...

錯位排列遞推公式推導

全錯位排列 即被著名數學家尤拉 leonhard euler,1707 1783 稱為組合數論的乙個妙題的 裝錯信封問題 裝錯信封問題 是由當時最有名的數學家約翰 伯努利 johann bernoulli,1667 1748 的兒子丹尼爾 伯努利 danidbernoulli,1700 1782 提...