一些組合數學

2022-07-11 03:09:14 字數 2840 閱讀 4385

\[f(x) = (x-1)(f(x-1)+f(x-2))

\]\(f(x)\) 含義為放置的所有數中有 \(x\) 個數錯位排列的情況數。

假定當前準備放置第 \(x\) 個數。初始時將第 \(x\) 個數放在標號為 \(x\) 的位置。此時需要將 \(x\) 與前 \(x-1\) 個數中的某乙個交換

若前 \(x-1\) 個數均錯位排列,那麼目前有 \(x-1\) 種交換方案,即 \(f(x) \leftarrow (x-1)*f(x-1)\)

若前 \(x-1\) 個數中僅有乙個沒有錯位排列,那麼必須將第 \(x\) 個數與那個沒有錯排的數交換。共有 \(n-1\) 種乙個數沒有錯排的情況。那麼, \(f(x) \leftarrow (x-1)*f(x-2)*1\) 。

若前 \(x-1\) 個數中存在多於乙個數沒有錯位排列,此時無法通過一次交換使得所有數均錯位排列。

綜上,\(f(x) = (x-1)(f(x-1)+f(x-2))\)

\(\sum\limits_^n } = 2^n \ \ \ \ \ \ \ \ \sum\limits_^n (-1)^i } = 0\)

\(h(x) = \begin 1 & x \leq 2 \\ \frac} & x>2 \\ \sum\limits_^ & x>2 \end\)

第一類(stirling輪換數)

\(\begin n \\ k \end\) 表示將 \(n\) 個數劃分成 \(k\) 個圓排列的方案數

\[\begin n \\ k \end = \begin n-1 \\ k-1 \end + (n-1) \begin n-1 \\ k \end

\]將第 \(n\) 個數劃分為乙個新的排列,即 \(\begin n \\ k \end \leftarrow \begin n-1 \\ k-1 \end\)

將第 \(n\) 個數插入到乙個已有的排列中。因為是圓排列,所以插入到 \(n-1\) 個已有元素中的任意乙個的後面都可以計入答案。 \(\begin n \\ k \end \leftarrow (n-1) \begin n-1 \\ k \end\)

性質: \(n! = \sum\limits_^ n \\ i \end}\)

第二類(stirling子集數)

\(\begin n \\ k \end\) 表示將 \(n\) 個數劃分成 \(k\) 個集合的方案數

\[\begin n \\ k \end = \begin n-1 \\ k-1 \end + (k-1) \begin n-1 \\ k \end

\]將第 \(n\) 個數劃分為乙個新的集合,即 \(\begin n \\ k \end \leftarrow \begin n-1 \\ k-1 \end\)

將第 \(n\) 個數插入到乙個已有的集合中,即 \(\begin n \\ k \end \leftarrow (k-1) \begin n-1 \\ k \end\)

性質: $x^n = \sum\limits_^ n \ i \end} * i! * \dbinom } $

\[max(s) = \sum\limits_ min(t)}

\]證明:

設 \(a_i\) 表示對 \(s\) 集合排序後第 \(i\) 大的數。

若 \(min(s)=a_1\) ,則 \(s = \\) 。

對於這種情況,對答案的貢獻為 \((-1)^a_1 = a_1\) 。

若 \(min(s) = a_k \ (k > 1)\) ,則 \(s = \\) 。即, \(a_1\) 到 \(a_\) 所有元素的某個子集再加上 \(a_k\) 本身。

對於這種情況,觀察可知 \(a_1\) 到 \(a_k\) 所有元素的子集中,大小為奇數的集合與大小為偶數的集合數量相等。因此,對答案的貢獻為 \(0\) 。

綜上,答案恰為 \(a_1\) ,即 \(max(s)\) 。

例題:[haoi2015] 按位或

拆位考慮,答案即為 \(e(max\)\) ,其中 \(e(x)\) 表示 \(x\) 中元素的最晚出現時間的期望。注意, \(x\) 是乙個二進位制數,代表乙個集合。若其中第 \(i\) 位為 \(1\) 則表示集合中存在 \(i\) 。

直接求解較為困難,故可以轉為求解 \(e(min\)\) ,再容斥得出答案。

$e(max) = \sum\limits_ e(min)} \ \ $ 那麼,如果對於任意集合 \(t\) ,可以迅速求出 \(e(min\)\) ,本題就得到解決。

\(e(min\) = \dfrac }\) 。分母的那個sum求解較為困難,但發現分母可以當成 \(g\) 的補集的子集和;而子集和可以預處理的出。於是本題得解。

#include using namespace std;

#define m 1100005

int n, popcnt[m], flag[m];

double ans, p[m], sum[m];

int main()

for (int len = 2; len <= (1<>1); j++)

p[i+j+(len>>1)] += p[i+j]; // 預處理子集和

double ans = 0;

for (int sta = 1; sta < (1<1e-10)

ans += 1.0 * flag[sta] / (1-p[((1<\(\text\) 容斥

\[kth\ max(s) = \sum\limits_ \binom min(t)}

\]證明略。

例:重返現世

\(\text\) 板子。

對所有原料的期望出現時間排序,那麼答案為出現時間第 \(k\) 小的元素的出現時間。(即,第 \(n-k+1\) 大)

本題的難點在於加速運算。發現 \(n \le 1000\) ,故直接列舉子集不可取。

記錄一些 trivial 組合數學相關

1.sperner theorem設a 為n元集,a1 a2,am為a 的子集且兩兩互不包含,則m的最大值為 n n 2 proof lemma m i 11 n a i 1 proof of lemma it is equivalent to m i 1 ai n ai n on the one ...

組合數的一些性質

眾所周知,當n,m在自然數集中有 cm n n m n m 由此可證得cm n cm n 1 cm 1 n 1 而cm n 1 mc n m 1m是否也能用兩個組合數來表示cm n答案是肯定的。容易猜想cm n c m n 1 cm 1 n 1而且猜想很容易證得是正確的。證明如下 cm n 1 m ...

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...