[總結]數論和組合計數類數學相關(定理&證明&板子)


0 寫在前面

0.0 前言

由於我太菜了,導致一些東西一學就忘,特開此文來記錄下最讓我頭痛的數學相關問題。

一些引用的文字都注釋了原文鏈接,若侵犯了您的權益,敬請告知;若文章中出現錯誤,也煩請告知。

該文於 2018.3.31 完成最后一次修改(若有出錯的地方,之后也會進行維護)。其主要內容限於數論和組合計數類數學相關問題。因為版面原因,其余數學方面的總結會以全新的博文呈現。

感謝你的造訪。

0.1 記號說明

由於該文完成的間隔跨度太大,不同時期的內容的寫法不嚴謹,甚至 $\LaTeX$ 也有許多不規范的表達。我懶也不想改...請見諒...

1 數論

1.0 gcd

1.0.0 gcd

$\gcd(a, b) = \gcd(b, a \mod b)$

證明:設 $c \mid a, c \mid b$ ,則 $c \mid (b-a)$ 。

   設 $c \nmid a$ ,則 $c$ 不是 $a,b-a$ 的公因子。

   設 $c \mid a$ , $c \nmid b$ ,則 $c$ 不是 $a,b-a$ 的公因子。

1 int gcd(int a, int b) {
2     return b == 0 ? a : gcd(b, a%b);
3 } 

1.0.1 exgcd

對於一組不定方程 $a \times x+b \times y = c$ 。若 $gcd(a, b) \mid c$ 則這組方程有無數組解,否則無解。

求出一組 $a \times x+b \times y = gcd(a, b)$的解需要$exgcd$,是在$gcd$遞歸函數過程中實現的。

設$x_0$,$y_0$是這一層的解,$x_1$,$y_1$是上一層的解。

首先邊界條件:當$b = 0$時顯然$x_0 = 1$,$y_0 = 0$。

其他情況下有:$x_0 = y_1$,$y_0 = x_1- \frac{a}{b} \times y_1$。

證明(摘自PIPIBoss):

$gcd(a, b) = x_0 \times a+y_0 \times b$
$gcd(b, a \mod b) = x_1 \times b+y_1 \times (a \mod b) = x_1 \times b+y_1 \times (a-\frac{a}{b} \times b)$
因為       $gcd(a, b) = gcd(b, a \mod b)$
得        $x_0 \times a+y_0 \times b = x_1 \times b+y_1 \times (a-\frac{a}{b} \times b)$
合並得      $x_0 \times a+y_0 \times b = y_1 \times a+(x_1-\frac{a}{b} \times y_1) \times b$
根據恆等定理   $x_0 = y_1$,$y_0 = x_1-\frac{a}{b} \times y_1$
 1 int exgcd(int a, int b, int &x, int &y) {
 2     if (b == 0) {
 3         x = 1; y = 0;
 4         return a;
 5     }
 6     int c = exgcd(b, a%b, x, y);
 7     int t = x;
 8     x = y;
 9     y = t-a/b*y;
10     return c;
11 }
我們求出該方程一組解$x_0$,$y_0$后,其他的解滿足:$x' = x_0+{b \over {gcd}} \times t$,$y' = y_0-{a \over {gcd}} \times t$,$t$為任意整數。
對於上述式子,我們將其帶入不定方程后發現是成立的。同時由於除去 $gcd(a, b)$ 所以解的間距也是最小的,所以通解式子是成立的。

1.1 逆元

對於正整數,如果有,那么把這個同余方程中的最小正整數解叫做的逆元。

逆元一般用擴展歐幾里得算法來求得,如果為素數,那么還可以根據費馬小定理得到逆元為

推導過程如下:

另外,逆元還有線性算法:

首先,$1^{-1} ≡ 1(\mod p)$

然后,我們設$p=k \times i+r$,$r<i$,$1<i<p$,再將這個式子放到$\mod p$意義下,就有:

$$k \times i+r ≡ 0(\mod p)$$

在等號兩邊同乘上$i^{-1}$,$r^{-1}$,就會得到:

$$k \times r^{-1}+i^{-1} ≡ 0(\mod p)$$

$$i^{-1} ≡ -k \times r^{-1}(\mod p)$$

$$i^{-1} ≡ -{\lfloor {p \over i} \rfloor} \times (p \mod i)^{-1}(\mod p)$$

遞推代碼就是:

1 A[i] = -(p/i)*A[p%i]

1.2 中國剩余定理(摘自MashiroSky

1.2.0 中國剩余定理

  在《孫子算經》中有這樣一個問題:“今有物不知其數,三三數之剩二(除以3余2),五五數之剩三(除以5余3),七七數之剩二(除以7余2),問物幾何?”這個問題稱為“孫子問題”,該問題的一般解法國際上稱為“中國剩余定理”。具體解法分三步:

    1. 找出三個數:從3和5的公倍數中找出被7除余1的最小數15,從3和7的公倍數中找出被5除余1 的最小數21,最后從5和7的公倍數中找出除3余1的最小數70。
    2. 用15乘以2(2為最終結果除以7的余數),用21乘以3(3為最終結果除以5的余數),同理,用70乘以2(2為最終結果除以3的余數),然后把三個乘積相加${15 \times 2+21 \times 3+70 \times 2}$得到和233。
    3. 用233除以3,5,7三個數的最小公倍數105,得到余數23,即${ 233\%105=23 }$。這個余數23就是符合條件的最小數。

  就這么簡單。我們在感嘆神奇的同時不禁想知道古人是如何想到這個方法的,有什么基本的數學依據嗎?

  我們將“孫子問題”拆分成幾個簡單的小問題,從零開始,試圖揣測古人是如何推導出這個解法的。

  首先,我們假設${n_1}$是滿足除以3余2的一個數,比如2,5,8等等,也就是滿足${3 \times k+2(k>=0)}$的一個任意數。同樣,我們假設${n_2}$是滿足除以5余3的一個數,${n_3}$是滿足除以7余2的一個數。

  有了前面的假設,我們先從${n_1}$這個角度出發,已知${n_1}$滿足除以3余2,能不能使得${n_1+n_2}$的和仍然滿足除以3余2?進而使得${n_1+n_2+n_3}$的和仍然滿足除以3余2?

  這就牽涉到一個最基本數學定理,如果有${ a \% b=c }$,則有${ (a+k \times b) \% b=c(k為非零整數) }$,換句話說,如果一個除法運算的余數為${c}$,那么被除數與${k}$倍的除數相加(或相減)的和(差)再與除數相除,余數不變。這個是很好證明的。

  以此定理為依據,如果${n_2}$是3的倍數,${n_1+n_2}$就依然滿足除以3余2。同理,如果${n_3}$也是3的倍數,那么${n_1+n_2+n_3}$的和就滿足除以3余2。這是從${n_1}$的角度考慮的,再從${n_2}$,${n_3}$的角度出發,我們可推導出以下三點:

    1. 為使${n_1+n_2+n_3}$的和滿足除以3余2,${n_2}$和${n_3}$必須是3的倍數。
    2. 為使${n_1+n_2+n_3}$的和滿足除以5余3,${n_1}$和${n_3}$必須是5的倍數。
    3. 為使${n_1+n_2+n_3}$的和滿足除以7余2,${n_1}$和${n_2}$必須是7的倍數。

  因此,為使${n_1+n_2+n_3}$的和作為“孫子問題”的一個最終解,需滿足:

    1. ${n_1}$除以3余2,且是5和7的公倍數。
    2. ${n_2}$除以5余3,且是3和7的公倍數。
    3. ${n_3}$除以7余2,且是3和5的公倍數。

  所以,孫子問題解法的本質是從5和7的公倍數中找一個除以3余2的數${n_1}$,從3和7的公倍數中找一個除以5余3的數${n_2}$,從3和5的公倍數中找一個除以7余2的數${n_3}$,再將三個數相加得到解。在求${n_1}$,${n_2}$,${n_3}$時又用了一個小技巧,以${n_1}$為例,並非從5和7的公倍數中直接找一個除以3余2的數,而是先找一個除以3余1的數,再乘以2。也就是先求出5和7的公倍數模3下的逆元,再用逆元去乘余數。

  這里又有一個數學公式,如果${a \% b=c}$,那么${(a \times k) \% b=a \% b+a \% b+…+a \% b=c+c+…+c=k \times c(k>0)}$,也就是說,如果一個除法的余數為${c}$,那么被除數的${k}$倍與除數相除的余數為${k \times c}$。展開式中已證明。

  最后,我們還要清楚一點,${n_1+n_2+n_3}$只是問題的一個解,並不是最小的解。如何得到最小解?我們只需要從中最大限度的減掉掉3,5,7的公倍數105即可。道理就是前面講過的定理“如果${a \%b=c}$,則有${(a-k \times b) \% b=c}$”。所以${(n_1+n_2+n_3)\% 105}$就是最終的最小解。

  這樣一來就得到了中國剩余定理的公式:

設正整數兩兩互素,則同余方程組

                             

有整數解。並且在模下的解是唯一的,解為

                               

其中,而的逆元。

 1 int ex_gcd(int a, int b, int &x, int &y) {
 2     if (b == 0) {
 3         x = 1, y = 0; return a;
 4     }
 5     int gcd = ex_gcd(b, a%b, x, y);
 6     int t = x;
 7     x = y;
 8     y = t-a/b*y;
 9     return gcd;
10 }
11 int inv(int a, int b) {
12     int x, y;
13     ex_gcd(a, b, x, y);
14     return (x%b+b)%b;
15 }
16 int CRT() {
17     int M = 1, ans = 0;
18     for (int i = 1; i <= n; i++) M *= m[i];
19     for (int i = 1; i <= n; i++)
20         (ans += a[i]*(M/m[i])*inv(M/m[i], m[i])) %= M;
21     return (ans+M)%M;
22 }

1.2.1 擴展中國剩余定理*

  普通的中國剩余定理要求所有的互素,那么如果不互素呢,怎么求解同余方程組?

  這種情況就采用兩兩合並的思想,假設要合並如下兩個方程:

  那么得到:

  我們需要求出一個最小的${x}$使它滿足:

  那么${x_1}$和${x_2}$就要盡可能的小,於是我們用擴展歐幾里得算法求出${x_1}$的最小正整數解,將它代回${a_1+m_1x_1}$,得到${x}$的一個特解${x'}$,當然也是最小正整數解。

  所以${x}$的通解一定是${x'}$加上${lcm(m1,m2) \times k}$,這樣才能保證${x}$模${m_1}$和${m_2}$的余數是${a_1}$和${a_2}$。由此,我們把這個${x'}$當做新的方程的余數,把${lcm(m1,m2)}$當做新的方程的模數。(這一段是關鍵

  合並完成:

1.3 Catalan數(摘自Miskcoo

1.3.0 帶限制條件的路徑總數

首先我們來看一個問題:

在一個平面直角坐標系中,只能往右或往上走一個單位長度,問有多少種不同的路徑可以從左下角 (1, 1) 走到右上角 (n, n),並且要求路徑不能經過直線 y = x 上方的點,下圖中的路徑都是合法的(圖片來源 Wikipedia)

450px-Catalan_number_4x4_grid_example.svg

如果沒有限制條件,那么從左下角走到右上角一共有 2n 步,有 n 步是往右,另外 n 步是往上,那么路徑方案數就是 2n 步中選擇 n 步往右,一共有 {2n} \choose {n} (即 C_{2n}^n)種方案

那么我們考慮一下這里面有多少種方案是不合法的

首先對於每一種不合法的方案,它的路徑一定與 y = x + 1 有交。我們找到它與 y = x + 1 的第一個交點,然后將這個點后面部分的路徑關於 y = x + 1 做一個對稱。由於原來路徑到達 (n, n),新的對稱之后的路徑就會到達 (n - 1, n + 1)。這樣我們把每一種不合法方案都對應到了一條從 (1, 1) 到 (n - 1, n + 1) 的路徑,現在再來看是否每一條這樣的路徑都能對應到一種不合法方案,如果是,那么這就建立了一個一一映射的關系,也就是它們的方案總數相同。這是肯定的,因為每一條這樣的路徑必定與 y = x + 1 有交,那么對稱回去,就得到一條不合法方案

由於從 (1, 1) 到 (n - 1, n + 1) 的路徑有 {n - 1 + n + 1} \choose {n - 1} 條,那么合法的方案就是

 C_n = {{2n} \choose {n}} - {{2n} \choose {n - 1}} = \frac{1}{n + 1} {{2n} \choose {n}}

我們把這個方案數記為 C_n,這就是著名的 Catalan 數

我們來看看它的前幾項(n 從 0 開始)

1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190

1.3.1 括號序列計數

再來看一個問題:有多少種不同的長度為 n 的括號序列?

首先一個括號序列是指 (), ()(), (())() 這樣的由括號組成的序列,並且沒有左右括號無法匹配的情況

我們可以將長度為 2n 的括號序列映射成剛剛所說的路徑:首先對於左括號,那么就向右走一個單位長度,對於右括號,那么就向上走一個單位長度,由於括號序列合法,那么每次向右走的次數不會少於向上的次數,也就是這條路徑不會在 y = x 之上。再考慮每一條這樣的路徑,也能夠對應到一種合法的括號序列,因此,長度為 2n 的括號序列的方案數就是 C_n

1.3.2 出棧順序

現在來考慮你有 n 個元素(元素之間是沒有區別的)和一個棧,每次可以將一個元素入棧,或者將棧頂元素彈出,問有多少種可能的操作序列,這可以將問題對應成括號序列,入棧為左括號,出棧為右括號,因此方案數也是 C_n

1.3.3 排隊問題

現在有 2n 個人,他們身高互不相同,他們要成兩排,每一排有 n 個人,並且滿足每一排必須是從矮到高,且后一排的人要比前一排對應的人要高,問有多少種排法

我們考慮先把這些人從矮到高排成一排,那么現在來分配哪個人在前,哪個人在后,例如有 6個人,身高是 1, 2, 3, 4, 5, 6

那么我們用 1 表示這個人應該在后排,0 表示這個人應該在前排,例如說 100110 表示兩排分別是 2, 3, 6 和 1, 4, 5 這是不合法的

那么合法方案應該是怎么樣的呢?后排要比前排對應的人高,也就是說 0 的出現次數在每一個地方都不應該小於 1,這恰恰又是一個括號序列,因此,方案仍然是 Catalan 數

1.3.4 二叉樹計數

現在你需要統計有多少種不同的 n 個結點的二叉樹

Catalan_number_binary_tree_example

圖上的是 3 個結點的二叉樹,一共有 5 種方案

朴素的想法是由於二叉樹是遞歸定義的,可以考慮使用遞推方法

我們可以用 f_n 表示有 n 個結點的二叉樹的方案數(空樹算一種,即 f_0 = 0),那么枚舉子樹大小可以得到方程

 f_n = \sum_{i = 0}^{n - 1} f_if_{n - i - 1}

如果直接計算,你需要 \mathcal O(n^2) 的時間

現在我們換一個角度來想,對這棵二叉樹進行遍歷,並且考慮一個括號序列,當第一次遇到這個結點的時候,在括號序列末尾添加一個左括號,在從左子樹回到這個結點的時候,在括號序列中添加一個右括號,這樣,將每一種不同的二叉樹都對應到了一種不同的括號序列,同樣對於每一種不同的括號序列都可以找到對應的一種不同的二叉樹,因此,有 n 個結點的二叉樹的數量也是 C_n

生成函數的證明*

我們可以定義序列 C_n 的生成函數為 C(z),再根據上面的遞推式,可以列出方程

 C(z) = zC^2(z) + 1

解方程可以得到

 C(z) = \frac{1 \pm \sqrt{1 - 4z}}{2z}

因為 C(0) = C_0 = 1,因此對上式求極限

 \begin{eqnarray*}
 \lim_{z \rightarrow 0^+} \frac{1 + \sqrt{1 - 4z}}{2z} &=& +\infty \\
\lim_{z \rightarrow 0^+} \frac{1 - \sqrt{1 - 4z}}{2z} &=& 1 
\end{eqnarray*}

因此取負號,C(z) = \frac{1 - \sqrt{1 - 4z}}{2z}

根據廣義二項式定理展開 \sqrt{1 - 4z}

\sqrt{1-4z} = \left (1-4z \right )^{\frac{1}{2}} = \sum_{i=0}^{\infty}{\frac{1}{2} \choose i}(-4z)^i

然后考慮第 n 項系數

因此可以得到

同樣得到 C_n = \frac{1}{n+1}{{2n} \choose n}

1.4 素數

1.4.0 素數的相關定理

唯一分解定理

對任一整數 $a > 1$ ,有 $a={p_1}^{a_1}{p_2}^{a_2}…{p_n}^{a_n}$ ,其中 $p_1<p_2<…<p_n$ 均為素數,而 $a_1$,$a_2$…,$a_n$ 是正整數。

約數和定理

對於唯一分解定理中的式子,滿足 $a$ 的正約數個數為: $(1+a_1)(1+a_2)…(1+a_n)$

$a$ 的約數和個數為: $\prod_{i = 1}^n \sum_{j = 0}^{a_i} p_i^j$

威爾遜定理

若 $p$ 是素數,則 $(p-1)! \equiv -1 \pmod{p}$ 。

其逆定理也成立,即:若對某一正整數 $p$ ,有 $(p-1)! \equiv -1 \pmod{p}$ ,則 $p$ 一定是素數。

由於 $p \mid (p-1)!+1$ ,可以構造函數 $f(n) = \sin(\pi \cdot \frac{(n-1)!+1}{n})$ 。這個函數的零點都是素數,並且所有素數都是這個函數的零點。

費馬小定理

若 $p$ 為素數, $a$ 為正整數,且 $a$ 和 $p$ 互素,則: $a^{p-1} \equiv 1 \pmod{p}$ 。

證明:首先, $p-1$ 個整數 $a,2a,3a,\cdots,(p-1)a$ 中沒有一個是 $p$ 的倍數。

   其次, $a,2a,3a,\cdots,(p-1)a$ 中沒有任何兩個同余於模 $p$ 的。

   於是: $a,2a,3a,\cdots,(p-1)a$ 對模 $p$ 的同余既不為 $0$ ,也沒有兩個同余相同,因此,這 $p-1$ 個數對模 $p$ 的同余一定是 $1,2,3,\cdots,p-1$ 的某一種排列,即:$$a \cdot 2a \cdot 3a \cdot \cdots \cdot (p-1)a \equiv 1 \cdot 2 \cdot 3 \cdot \cdots \cdot (p-1) \pmod{p}$$

   化簡為: $$a^{p-1} \cdot (p-1)! \equiv (p-1)! \pmod{p}$$

   由於模數 $p$ 是質數,根據威爾遜定理得出 $(p-1)!$ 和 $p$ 互質。所以約去 $(p-1)!$ 。

   得到: $$a^{p-1} \equiv 1 \pmod{p}$$

歐拉定理

歐拉函數:記小於等於 $n$ 的數中與 $n$ 互質的數的個數為 $\varphi(n)$ 。

引理1:

①如果 $n$ 為某一個素數 $p$ ,則 $\varphi(p) = p-1$;

②如果 $n$ 為某一個素數 $p$ 的冪次 $p^a$ ,則 $\varphi(p^a) = (p-1) \cdot p^{a-1}$ ;

③如果 $n$ 為兩個互質的數 $a,b$ 的乘積,則 $\varphi(ab) = \varphi(a) \cdot \varphi(b)$ 。

證明:①顯然;

   ②因為比 $p^a$ 小的數有 $p^a-1$ 個,那么有 $p^{a-1}-1$ 個數能被 $p$ 所整除(因為把 $1 \sim p^a-1$ 的 $p$ 的倍數都篩去了),所以 $\varphi(p^a) = (p-1) \cdot p^{a-1}$ ;

   ③對於所有小於 $a$ 且與 $a$ 互質的數 $p$ 和小於 $b$ 且與 $b$ 互質的數 $q$,都能組成 $aq+bp$ 與 $n$ 互質,因此由乘法原理,滿足條件。

引理2:

設 $n = \prod_{i = 1}^k p_i^{a_i}$ 為正整數 $n$ 的素數冪乘積表示式。則 $$\varphi(n) = n \cdot \prod_{i = 1}^k \left(1-\frac{1}{p_i} \right)$$

證明:

\begin{aligned} \varphi(n) &= \prod_{i = 1}^k \varphi(p_i^{a_i})\\&= \prod_{i = 1}^k p_i^{a_i}\cdot \left(1-\frac{1}{p_i} \right)\\&= n \cdot \prod_{i = 1}^k \left(1-\frac{1}{p_i} \right)\end{aligned}

歐拉定理:若 $a$ 與 $m$ 互質,則 $a^{\varphi(m)} \equiv 1 \pmod{m}$ 。

證明:

   按照證明費馬小定理思路:
   將小於 $m$ 的 $\varphi(m)$ 個與 $m$ 互質的整數取出,為 $x_1,x_2,\cdots,x_{\varphi(m)}$ 。
   取出 $\varphi(m)$ 個整數 $x_1a,x_2a,\cdots,x_{\varphi(m)}a$ ,其中沒有一個是 $m$ 的倍數,也沒有兩個模 $m$ 同余的。
   簡要證明:假設 $x_ia \equiv x_ja \pmod m$ (假設 $x_i > x_j$ )。顯然 $(x_i-x_j)a \equiv 0 \pmod m$ ,即 $m \mid (x_i-x_j)a$ ,由於 $gcd(a, m) = 1$ 且 $(x_i-x_j) < m$ ,則 $m \nmid (x_i-x_j)a$ ,矛盾,原命題成立。
   又因為 $x_1a,x_2a,\cdots,x_{\varphi(m)}a$ 在模 $m$ 意義下均與 $m$ 互素。
   簡要證明:記 $x_ia \equiv b \pmod{m}$ ,假設 $b$ 不互素,顯然 $gcd(b, m) = d \neq 1$ , $b = k_1 \cdot d, m = k_2 \cdot d$ ,由於 $x_ia = b+K'm$ ,即 $x_ia = (k_1+K'k_2) \cdot d$ ,則 $x_ia$ 與 $m$ 有共同因子 $d$ ,但由於 $a, x_i$ 均與 $m$ 互素,矛盾,原命題成立。
   有上述兩個定理,故 $x_1a,x_2a,\cdots,x_{\varphi(m)}a$ 在模 $m$ 意義下是 $x_1,x_2,\cdots,x_{\varphi(m)}$ 的一個排列。
   故有: $$x_1a\cdot x_2a\cdot\cdots\cdot x_{\varphi(m)}a \equiv x_1\cdot x_2\cdot\cdots\cdot x_{\varphi(m)} \pmod{m}$$
   化簡為: $$a^{\varphi(m)}\cdot x_1\cdot x_2\cdot\cdots\cdot x_{\varphi(m)} \equiv x_1\cdot x_2\cdot\cdot\cdot x_{\varphi(m)} \pmod{m}$$
   由於 $x_1,x_2,\cdots,x_{\varphi(m)}$ 均與 $m$ 互質,所以可以約去,得: $$a^{\varphi(m)} \equiv 1 \pmod{m}$$

線性篩歐拉函數

用到的性質(其中 $p$ 為素數):

① $\varphi(p) = p-1$ ;

②如果 $p \mid i$ ,那么 $\varphi(i \cdot p) = p\cdot \varphi(i)$ ;

如果 $p \nmid i$ ,那么 $\varphi(i \cdot p) = (p-1)\cdot \varphi(i)$

證明:①顯然;

   ②由於 $p \mid i$ ,顯然 $i$ 與 $i \cdot p$ 間沒有不同的因子。
    則對於一個整數 $x$ ,若 $gcd(x,i) = 1$ 則 $gcd(x,i \cdot p) = 1$ 。
    我們將從 $0$ 開始長度為 $i \cdot p$ 的數軸分成 $p$ 段長度為 $i$ 的小段。對於第一段為 $[1,i]$ ,第二段為 $[i+1, i+i]$ ……以此類推。
    對於第一段中,與 $i$ 互質的數有 $\varphi(i)$ 個。即在第一段中與 $i \cdot p$ 互質的數也有 $\varphi(i)$ 個。
    現在我們證明對於整數 $x$ 若與 $i$ 互質,則 $x+i$ 也與 $i$ 互質。
    采用反證法,我們假設 $gcd(x, i) = 1$ 但 $gcd(x+i, i) = b \neq 1$ 。
    容易發現: \begin{cases} \begin{aligned} x+i = b\cdot k_1 \\ i = b \cdot k_2 \end{aligned} \end{cases} $k_1,k_2$ 均為整數。
    所以 $x = (k_1-k_2)\cdot b$ ,故 $gcd(x, i) = b \neq 1$ ,與題設不符,原命題成立。
    下證對於整數 $x$ 若與 $i$ 不互質,則 $x+i$ 也與 $i$ 不互質。
    假設 $gcd(x, i) = b \neq 1$ , \begin{cases} \begin{aligned} x = b\cdot k_1 \\ i = b \cdot k_2 \end{aligned} \end{cases}$k_1,k_2$ 均為整數。
    所以 $x+i = (k_1+k_2)\cdot b$ ,故 $gcd(x+i, i) = b \neq 1$ ,原命題成立。
    綜上,如果 $p \mid i$ ,那么 $\varphi(i \cdot p) = p\cdot \varphi(i)$ ;

   ③因為 $p \nmid i$ ,且 $p$ 為質數,所以 $i$ 與 $p$ 互質,由於歐拉函數是積性函數, $\varphi(i \cdot p) = \varphi(p)\cdot \varphi(i)$ ,又 $\varphi(p) = p-1$

 1 void get_phi() {
 2     memset(isprime, 1, sizeof(isprime)); isprime[1] = 0; phi[1] = 1;
 3     for (int i = 2; i <= n; i++) {
 4         if (isprime[i]) phi[i] = i-1, prime[++tot] = i;
 5         for (int j = 1; j <= tot && i*prime[j] <= n; j++) {
 6             isprime[i*prime[j]] = 0;
 7             if (!(i%prime[j])) {phi[i*prime[j]] = phi[i]*prime[j]; break; }
 8             else phi[i*prime[j]] = phi[prime[j]]*phi[i];
 9         }
10     }
11 }

擴展歐拉定理:$a^q \equiv a^{q\ mod\ \varphi(m)+\varphi(m)} \pmod{m}$ ,其中 $a,m \in \mathbb{Z}^*$

證明(摘自鄧禕明

要證明擴展歐拉定理則只需證a的任意一個質因子 p_i  {p_i}^q \,\equiv\,{p_i}^{q\,mod\,\varphi (m)\,+\,\varphi (m) }\;(mod\,m)

簡單解釋一下這是如何轉化的。

{p_i}^q \equiv {p_i}^{q \,mod \,\varphi (m) + \varphi (m) }(mod\, m)

根據同余式可乘可推公式二

 ({p_i}^q)^{r_i} \equiv ({p_i}^{q \,mod \,\varphi (m) + \varphi (m) })^{r_i}(mod \,m)

 ({p_i}^{r_i})^q \equiv ({p_i}^{r_i})^{q\, mod\, \varphi (m) + \varphi (m)}(mod \,m)

根據同余式可乘得到

{p_1}^{r_1} *{p_2}^{r_2} * {p_3}^{r_3}...)^q \equiv ({p_1}^{r_1} * {p_2}^{r_2} * {p_3}^{r_3}...)^{q\,mod\,\varphi (m) + \varphi (m)}(mod\,m)

可以發現這就是

a^q \equiv a^{q \,mod \,\varphi (m) + \varphi (m)}(mod\,m)

那么現在要證明的東西已經轉化, 考慮如何證得。

pa 某質因子, 若 p\not\mid m 則由歐拉定理顯然證得, 考慮 p\mid m.

m = p^r * s p^{\varphi (s)} \equiv 1 (mod\, s) (因為 sp 互質, 由歐拉定理可得)

由歐拉函數的積性 \varphi (m) = \varphi (p^r) * \varphi (s)

\varphi (s) \mid \varphi (m)

所以

p^{\varphi (m)} \equiv 1 (mod \,s)

從而

p^q \equiv p ^ {q \,mod\, \varphi(m)} (mod \,s)

顯然式子同時乘以 q^r 得到

p^{q + r} \equiv p ^ {q\, mod\, \varphi(m) + r} (mod\,m) 因為 (m = s * q^r)

顯然r \leq \varphi(m) 所以兩邊同時乘以p^{\varphi(m) - r} 可以得到上面轉化出來要求的式子

p^q \equiv p^{q \,mod\, \varphi (m) + \varphi (m) }(mod\,m)

證畢。

1.4.1 降冪大法

$$a^b\equiv
\begin{cases}
a^{b\ mod \ \varphi(p)}~~~~~~~~~~~gcd(a,p)=1\\
a^b~~~~~~~~~~~~~~~~~~~~~gcd(a,p)\neq1,b<\varphi(p)\\
a^{b\ mod \ \varphi(p)+\varphi(p)}~~~~gcd(a,p)\neq1,b\geq\varphi(p)
\end{cases}\pmod{p}$$

1.4.2 Miller-Rabin 素數測試

主要利用費馬小定理 $a^{p-1} \equiv 1 \pmod{p}$ ,實現的過程如下:

    1. 計算奇數 $M$ ,使得 $N = 2^r \times M+1$
    2. 選擇隨機數 $A < N$
    3. 對於任意 $i < r$ ,若 $A^{2^i \times M}~mod~N = N-1$ ,則 $N$ 通過隨機數 $A$ 的測試
    4. 或者,若 $A^M~mod~N = 1$ ,則 $N$ 通過隨機數 $A$ 的測試
    5. 讓 $A$ 取不同的值對 $N$ 進行 $5$ 次測試,若全部通過則判定 $N$ 為素數

而在實際運用中,我們可以直接取 $r = 0$ ,從而省去步驟 $3$ 的測試,提高速度;另外的可以首先用幾個小素數對 $N$ 進行測試。除此之外也可以引入“二次探測”的思想,防止Carmichael數 卡。

二次探測:對於一個奇素數 $p$ ,對於關於 $x$ 的同余方程 $x^2 \equiv 1 \pmod{p}$ ,在 $[1, p)$ 上的解僅有 $x = 1$ 及 $x = p-1$ 。

 1 const int prime[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
 2 
 3 LL quick_multi(LL a, LL b, LL p) {
 4     LL ans = 0;
 5     while (b) {
 6         if (b&1) ans = (ans+a)%p;
 7         a = (a+a)%p, b >>= 1;
 8     }
 9     return ans;
10 }
11 LL quick_pow(LL a, LL b, LL p) {
12     LL ans = 1;
13     while (b) {
14         if (b&1) ans = quick_multi(ans, a, p);
15         a = quick_multi(a, a, p), b >>= 1;
16     }
17     return ans;
18 }
19 bool Miller_Rabin(LL x) {
20     if (x == 1) return false;
21     for (int i = 0; i < 10; i++) {
22         if (x == prime[i]) return true;
23         if (!(x%prime[i])) return false;
24     }
25     LL m = x-1, k = 0;
26     while (!(m&1)) m >>= 1, ++k;
27     for (int i = 0; i < 10; i++) {
28         LL a = rand()%(x-2)+2, pre = quick_pow(a, m, x), y;
29         for (int j = 0; j < k; j++) {
30             y = quick_multi(pre, pre, x);
31             if (y == 1 && pre != 1 && pre != x-1) return false;
32             pre = y;
33         }
34         if (pre != 1) return false;
35     }
36     return true;
37 }

1.4.3 Pollard-Rho 分解大數因子

代碼為求一個大數的最小質因數(POJ 1811):

 1 LL Pollard_Rho(LL x, int c) {
 2     LL i = 1, k = 2, a1, a2;
 3     a1 = a2 = rand()%(x-1)+1;
 4     while (true) {
 5         ++i, a1 = (quick_multi(a1, a1, x)+c)%x;
 6         LL d = gcd(Abs(a1-a2), x);
 7         if (1 < d && d < x) return d;
 8         if (a1 == a2) return x;
 9         if (i == k) a2 = a1, k <<= 1;
10     }
11 }
12 void find(LL x, int c) {
13     if (x == 1) return;
14     if (Miller_Rabin(x)) {ans = Min(ans, x); return; }
15     LL p = x, k = c;
16     while (p == x) p = Pollard_Rho(x, c--);
17     find(p, k), find(x/p, k);
18 }

1.4.4 Baby-Step-Giant-Step

 1 LL BSGS(LL a, LL b, LL c) {
 2     if (b == 1) return 0;
 3     if (a == 0 && b != 0) return -1;
 4     mp.clear();
 5     LL tim = ceil(sqrt((double)c)), tmp = b%c;
 6     for (int i = 0; i <= tim; i++) {
 7         mp.insert(tmp, i); tmp = tmp*a%c;
 8     }
 9     LL t = tmp = quick_pow(a, tim, c);
10     for (int i = 1; i <= tim; i++) {
11         if (mp.count(tmp)) return tim*i-mp.query(tmp);
12         tmp = tmp*t%c;
13     }
14     return -1;
15 }

擴展BSGS:

當模數 $c$ 不是質數的時候,顯然不能直接使用 $BSGS$ 了,考慮它的擴展算法。

前提:同余性質。

令 $d = gcd(A, C)$ , $A = a \cdot d,B = b \cdot d, C = c \cdot d$

則 $a \cdot d \equiv b \cdot d \pmod{c \cdot d}$

等價於 $a \equiv b \pmod{c}$

因此我們可以先消除因子。

對於現在的問題 $(a \cdot d)^x \equiv b \cdot d \pmod{c \cdot d}$ 當我們提出 $d = gcd(A, C)$ ($d \neq 1$)后,原式化為 $a \cdot (a \cdot d)^{x-1} \equiv b \pmod{c}$ 。

即求 $D \cdot A^{x-cnt} \equiv b \pmod{c}$ ,令 $x = i \cdot r-j+cnt$ , $r$ 是塊大小, $i,j\in \mathbb{Z}$ 。之后的做法就和 $BSGS$ 一樣了。

值得注意的是因為這樣求出來的解 $x \geq cnt$ 的,但有可能存在解 $x < cnt$ ,所以一開始需要特判。

 1 LL exBSGS(LL a, LL b, LL c) {
 2     if (b == 1) return 0;
 3     if (a == 0 && b != 0) return -1;
 4     LL cnt = 0, d = 1, t;
 5     while ((t = gcd(a, c)) != 1) {
 6         if (b%t) return -1;
 7         ++cnt, b /= t, c /= t, d = d*(a/t)%c;
 8         if (d == b) return cnt;
 9     }
10     mp.clear();
11     LL tim = ceil(sqrt(c)), tmp = b%c;
12     for (int i = 0; i <= tim; i++) {
13         mp.insert(tmp, i); tmp = tmp*a%c;
14     }
15     t = tmp = quick_pow(a, tim, c); tmp = (tmp*d)%c;
16     for (int i = 1; i <= tim; i++) {
17         if (mp.count(tmp)) return tim*i-mp.query(tmp)+cnt;
18         tmp = tmp*t%c;
19     }
20     return -1;
21 }

2 組合數學

2.0 一些公式

無重復的排列  $A_n^m = \frac{n!}{(n-m)!}$

無重復的組合  $C_n^m = \frac{A_n^m}{A_m^m} = \frac{n!}{m!(n-m)!}$

可重復的排列  $n^m$

可重復的組合  $C_{n+m-1}^m$

證明:用 $1,2,3,\cdots,n$ 表示 $n$ 個不同元素,這時從這 $n$ 個不同元素中取 $m$ 個元素的可重復組合具有下列形式: $$\{i_1,i_2,\cdots,i_m \},(1 \leq i_1 \leq i_2 \leq \cdots \leq i_m \leq n)$$
   在上述每個數從左至右逐個分別加上: $0,1,\cdots,m-1$ ,得到 $\{j_1,j_2,\cdots,j_m \}$ ,其中 $j_1 = i_1, j_2 = i_2+1,\cdots ,j_m = i_m+(m-1)$ ,滿足 $1 \leq j_1 < j_2 < \cdots < j_m \leq n+m-1$ ,而 $\{j_1,j_2,\cdots,j_m \}$ 恰好是從 $1,2,\cdots,n+m-1$ 這 $n+m-1$ 個元素中取 $m$ 個不同元素。

不全相異元素的全排列 如果 $n$ 個元素中,分別有 $n_1,n_2,\cdots,n_k$ 個元素相同,且 $n_1+n_2+\cdots+n_k = n$ ,則這 $n$ 個元素的全排列稱為不全相異元素的全排列,其不同的排列個數記為 $\binom{n}{n_1~~n_2~~\cdots~~n_k}$ ,則 $\binom{n}{n_1~~n_2~~\cdots~~n_k} = \frac{n!}{n_1!n_2!\cdots n_k!}$ 。

證明:假設滿足條件的排列數為 $f$ ,顯然 $f\cdot n_1! \cdot n_2! \cdot \cdots \cdot n_k! = n!$ 。故 $f = \frac{n!}{n_1!n_2!\cdots n_k!} = \binom{n}{n_1~~n_2~~\cdots~~n_k}$ 。

多組組合 把 $n$ 個元素分為 $k(k \leq n)$ 個按照一定順序排列的組,其中第 $i$ 組有 $n_i$ 個元素($i = 1,2,\cdots,k$ , $n_1+n_2+\cdots+n_k = n$),則不同的分組方法的種數為 $\binom{n}{n_1~~n_2~~\cdots~~n_k} = \frac{n!}{n_1!n_2!\cdots n_k!}$

證明:

\begin{aligned}
&~~~~C_n^{n_1}\cdot C_{n-n_1}^{n_2}\cdot \cdots \cdot C_{n-n_1-n_2-\cdots-n_{k-1}}^{n_k}\\ &= \frac{n!}{n_1!\cdot(n-n_1)!}\cdot \frac{(n-n_1)!}{n_2!\cdot(n-n_1-n_2)!}\cdot \cdots \cdot \frac{(n-n_1-\cdots -n_{k-1})!}{n_k!\cdot(n-n_1-\cdots -n_{k-1}-n_k)!}\\&=\frac{n!}{n_1!n_2!\cdots n_k!}
\end{aligned}

圓排列 將 $n$ 個不同元素不分首尾排成一圈,稱為 $n$ 個相異元素的圓排列,其排列種數為 $(n-1)!$ 。

項鏈數 將 $n$ 粒不同的珠子用線串成一副項鏈,則得到的不同項鏈數為 \begin{cases} 1& \text{$n \in \{1,2\}$}\\ \frac{1}{2}\cdot(n-1)!& \text{$n \in [3,+\infty)$} \end{cases}

一類不定方程的非負整數解的個數 不定方程 $x_1+x_2+\cdots+x_m = n~(m,n \in \mathbb{N}_+)$ 的非負整數解的個數為 $C_{n+m-1}^{m-1}$ 。推論:上述不定方程的正整數解的個數為 $C_{n-1}^{m-1}$ 。

證明:均可用“隔板法”證明,推論還需用“墊球法”。

容斥原理 設 $A_1,A_2,\cdots,A_n$ 為有限集合,用 $|A_i|$ 表示集合 $A_i$ 中的元素個數,那么
$$|A_1 \cup A_2 \cup \cdots \cup A_n| = \sum_{i=1}^n |A_i|-\sum_{1\leq i< j\leq n} |A_i\cap A_j|+\sum_{1\leq i< j< k\leq n} |A_i\cap A_j \cap A_k|-\cdots +(-1)^{n-1} |A_1\cap A_2 \cdots \cap A_n|$$

證明:若 $a \in A_1 \cup A_2 \cup \cdots \cup A_n$ ,則 $a$ 至少屬於 $A_1,A_2,\cdots,A_n$ 中一個集合。不妨設 $a$ 屬於 $A_1,A_2,\cdots,A_k~(1\leq k\leq n)$ 而不屬於其他集合。於是 $a$ 在上式左端計算了一次。而 $a$ 在右端共計算的次數為
\begin{aligned} &~~~~C_k^1-C_k^2+C_k^3-\cdots+(-1)^{k-1}C_k^k\\ &= C_k^0-(C_k^0-C_k^1+\cdots+(-1)^kC_k^k)\\ &= 1-(1-1)^k \\ &= 1 \end{aligned}

   若 $a \notin A_1 \cup A_2 \cup \cdots \cup A_n$ ,則 $a$ 在上式左右兩端計算的次數都為 $0$ 。原式成立。

篩法公式 設 $S$ 是有限集合, $A_i \subset S~(i=1,2,\cdots,n)$ , $A_i$ 在 $S$ 中的補集為 $\complement_S A_i~(i=1,2,\cdots,n)$ 則

$$|\complement_SA_1\cap\complement_SA_2\cap\cdots\cap\complement_SA_n| = |S|-\sum_{i=1}^n |A_i|+\sum_{1\leq i< j\leq n} |A_i\cap A_j|-\sum_{1\leq i< j< k\leq n} |A_i\cap A_j \cap A_k|+\cdots +(-1)^n |A_1\cap A_2 \cdots \cap A_n|$$

證明:因為 $|A_1 \cup A_2 \cup \cdots \cup A_n|=|S|-|\complement_S(A_1 \cup A_2 \cup \cdots \cup A_n)|$ ,並且由德·摩根律,我們有 $\complement_S(A_1 \cup A_2 \cup \cdots \cup A_n)=\complement_SA_1\cap\complement_SA_2\cap\cdots\cap\complement_SA_n$ 。再加上容斥原理的式子,得證。

錯排公式 $D_n = n!\left(1-\frac{1}{1!}+\frac{1}{2!}-\frac{1}{3!}+\cdots+(-1)^n\frac{1}{n!}\right)$

置換及其不動點 給定集合 $X=\{1,2,\cdots,n\}$ , $\varphi$ 是從 $X$ 到 $X$ 上的一一映射,通常記為

$$\varphi = \left\{^{~~~~1~~~~~~2~~~~~~\cdots~~~~~~n~~~~}_{\varphi(1)~~\varphi(2)~~~~\cdots~~~~\varphi(n)}\right\}$$

則稱 $\varphi$ 是 $X$ 上的置換,其中 $\varphi(i)$ 是元素 $i$ 在映射 $\varphi$ 下的象。因為是一一映射,所以 $\varphi(1),\varphi(2),\cdots,\varphi(n)$ 實際上是 $1,2,\cdots,n$ 的一個排列。滿足 $\varphi(i) = i$ 的數 $i$ 稱為 $\varphi$ 的一個不動點。容易證明,集合 $X$ 上沒有任何不動點的置換 $\varphi$ 的個數是 $D_n = n!\left(1-\frac{1}{1!}+\frac{1}{2!}-\frac{1}{3!}+\cdots+(-1)^n\frac{1}{n!}\right)$ 。

第一抽屜原理 如果將 $m$ 個物品放入 $n$ 個抽屜內,那么必有一個抽屜內至少有 $\left\lfloor \frac{m-1}{n}\right\rfloor+1$ 個物品。

第二抽屜原理 如果將 $m$ 個物品放入 $n$ 個抽屜內,那么必有一個抽屜內至多有 $\left\lfloor \frac{m}{n}\right\rfloor$ 個物品。

2.1 母函數

2.1.0 概念

設 $f(x) = (1+x)^n$ ,由二項式定理,有 $$f(x) = \sum_{k=0}^n C_n^kx^k=C_n^0+C_n^1x+C_n^2x^2+\cdots+C_n^nx^n$$

這時, $f(x)$ 對應了一個數列 $\{C_n^k,0\leq k\leq n\}$ ,即生成數列 $\{C_n^k\}$ ,因此,我們把函數 $f(x) = (1+x)^n$ 稱為數列 $\{C_n^k\}$ 的生成函數或母函數。

一般地說,對於有窮數列 $$a_0,a_1,a_2,\cdots,a_n$$

多項式 $f(x) = \sum_{k=0}^n a_kx^k=a_0+a_1x+a_2x^2+\cdots+a_nx^n$ 稱為數列 $\{a_k\}$ 的母函數。

更一般地,對於無窮數列 $$a_0,a_1,\cdots,a_n,\cdots$$

我們稱下列形式冪級數 $$f(x) = \sum_{n=0}^\infty a_nx^n=a_0+a_1x+\cdots+a_nx^n+\cdots$$

為無窮數列 $\{a_n\}$ 的母函數。

關於形式冪級數我們作如下的規定:設 $f(x) = \sum_{n=0}^\infty a_nx^n$ , $g(x) = \sum_{n=0}^\infty b_nx^n$ 是兩個形式冪級數,我們規定

(1) $f(x)=g(x)$ ,當且僅當 $a_n=b_n~(n=0,1,2,\cdots)$ ;

(2) $f(x) \pm g(x) = \sum_{n=0}^\infty(a_n\pm b_n)x^n$ ;

(3) $\alpha f(x) = \sum_{n=0}^\infty(\alpha a_n)x^n$ , $\alpha$ 為常數;

(4) $f(x)g(x) = \sum_{n=0}^\infty c_nx^n$ ,其中 $c_n = \sum_{k=0}^na_kb_{n-k},n=0,1,2,\cdots$ 。

2.1.1 公式

公式一(無窮遞縮等比數列求和公式) $$\frac{1}{1-x}=\sum_{n=0}^\infty x^n=1+x+x^2+\cdots+x^n+\cdots(|x|<1)$$

公式二 $$(1-x)^{-k}=\sum_{n=0}^\infty C_{n+k-1}^{k-1}x^n=1+C_{k}^{k-1}x+C_{k+1}^{k-1}x^2+\cdots+C_{n+k-1}^{k-1}x^n+\cdots(k \in \mathbb{Z}^*,|x|<1)$$

證明:公式二可由公式一兩邊求 $k-1$ 階導數后除以 $(k-1)!$ 而得到。

2.2 莫比烏斯反演

2.2.0 莫比烏斯函數

莫比烏斯函數,是一個積性函數,記作 $\mu$ ,它的定義如下:

(1)若 $d = 1$ ,那么 $\mu(d)=1$

(2)若 $d=p_1p_2\cdots p_k$ , $p_i$ 均為互異素數,那么 $\mu(d)=(-1)^k$

(3)其他情況下 $\mu(d)=0$

性質:對於 $\forall n \in \mathbb{N}_+$
$$\sum_{d\mid n} \mu(d)=\begin{cases} 1 &n=1\\0 &n>1\end{cases}$$

證明:1. $n=1$ 時顯然成立;
   2. $n>1$ 時,將 $n$ 分解為 $p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}$ , $\mu(d)\neq 0$ 的只有次數均為 $1$ 的因子,其中質因數個數為 $i$ 的因子個數有 $C_k^i$ 個。
    那么就有 \begin{aligned}\sum_{d\mid n} \mu(d)&=C_k^0-C_k^1+\cdots+(-1)^kC_k^k\\&=(1-1)^k=0 \end{aligned}

線性篩莫比烏斯函數

 1 void get_mu() {
 2     memset(isprime, 1, sizeof(isprime)); isprime[1] = 0, mu[1] = 1;
 3     for (int i = 2; i <= N; i++) {
 4         if (isprime[i]) prime[++tot] = i, mu[i] = -1;
 5         for (int j = 1; j <= tot && i*prime[j] <= N; j++) {
 6             isprime[i*prime[j]] = 0;
 7             if (!(i%prime[j])) {mu[i*prime[j]] = 0; break; }
 8             else mu[i*prime[j]] = -mu[i];
 9         }
10     }
11 }

2.2.1 莫比烏斯反演定理

若 $F(n)$ 和 $f(n)$ 是定義在非負整數集合上的兩個函數,並且滿足條件 $F(n)=\sum_{d\mid n} f(d)$ 。那么我們得到結論: $$f(n)=\sum_{d\mid n} \mu(d)F(\frac{n}{d})$$

證明: $$\sum_{d|n}\mu(d)F(\frac{n}{d})=\sum_{d|n}\mu(d)\sum_{k|\frac{n}{d}}f(k)=\sum_{k|n}f(k)\sum_{d|\frac{n}{k}}\mu(d)=f(n)$$

由這個定理我們可以得到莫比烏斯函數的另外一個性質: 對於$\forall n \in \mathbb{N}_+$

$$\sum_{d\mid n} \frac{\mu(d)}{d}=\frac{\varphi(n)}{n}$$

證明:

   引理: $n=\sum_{d\mid n} \varphi(d)$

   證明:

對於 $n$ 的每個因數 $d$ ,我們取出 $[1,d]$ 內的 $\varphi(d)$ 個與 $n$ 互素的數記做集合 $A=\{a_1,a_2,\cdots,a_{\varphi(d)}\}$ ,將集合 $A$ 內的元素對應到集合 $B=\{a_1\frac{n}{d},a_2\frac{n}{d},\cdots,a_{\varphi(d)}\frac{n}{d}\}$ 。顯然 $gcd(a_i\frac{n}{d},n)=\frac{n}{d}$ 。由於 $d$ 枚舉了所有 $n$ 的因數,所以 $\frac{n}{d}$ 也是。則集合 $B$ 內是 $[1,n]$ 內所有的數。故原命題成立。

   有了這個引理,我們將莫比烏斯反演定理中的 $F(n) = n,f(n) = \varphi(n)$ 。 \begin{aligned}\varphi(n)&=\sum_{d\mid n} \frac{n}{d}\mu(d)\\ \frac{\varphi(n)}{n}&=\sum_{d\mid n} \frac{\mu(d)}{d} \end{aligned}

第二形式: $$F(n)=\sum_{n\mid d} f(d)\Rightarrow f(n)=\sum_{n\mid d} \mu(\frac{d}{n})F(d)$$

證明:令 $k=\frac{d}{n}$ ,那么 $$\sum^{+\infty}_{k=1}\mu(k)F(nk)=\sum^{+\infty}_{k=1}\mu(k)\sum_{nk|t}f(t)=\sum_{n|t}f(t)\sum_{k|\frac{t}{n}}\mu(k)=f(n)$$

2.2.2 杜教篩(普適)

若 $f(n)$ 是一個積性函數,求 $f(n)$ 的前綴 $S(n)$ 。即 $S(n)=\sum\limits_{i=1}^nf(n)$ 。

狄利克雷卷積

對於數論函數 $g(n),f(n)$ ,其狄利克雷卷積 $h(n)$ 也是一個數論函數 $$h(n)=\sum_{d\mid n}g(d)f\left(\frac{n}{d}\right)$$

我們找到另一個積性函數 $g(n)$ ,讓 $f(n)$ 和 $g(n)$ 做一個卷積 $$(g*f)(n)=\sum_{d\mid n}g(d)f\left(\frac{n}{d}\right)$$

求卷積的前綴 $$\sum_{i=1}^n(g*f)(i)=\sum_{i=1}^n\sum_{d|i}g(d)f\left(\frac{i}{d}\right)$$

提出右式的 $d$ \begin{aligned}\Rightarrow\sum_{i=1}^n(g*f)(i)&=\sum_{d=1}^{n}g(d)\sum_{d|i}f\left(\frac{i}{d}\right)\\&=\sum_{d=1}^{n}g(d)\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}f(i)\\&=\sum_{d=1}^{n}g(d)S\left(\left\lfloor\frac{n}{d}\right\rfloor\right)\end{aligned}

容易得到這個式子 $$g(1)S(n)=\sum_{i=1}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)-\sum_{i=2}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)$$

其實就是 $$g(1)S(n)=\sum_{i=1}^n(g*f)(i)-\sum_{i=2}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)$$

我們發現如果狄利克雷卷積前綴很好算的話,積性函數的前綴也可以分塊遞歸來算了。

舉幾個例子:

1. 求 $S(n)=\sum\limits_{i=1}^n\mu(n)$

上述式子 $$g(1)S(n)=\sum_{i=1}^n(g*\mu)(i)-\sum_{i=2}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)$$

考慮到 $\sum\limits_{d\mid n}\mu(d)=[n=1]$ ,又由於 $(g*\mu)(n)=\sum\limits_{d\mid n}g(d)\mu\left(\frac{n}{d}\right)$ 。我們考慮讓 $g(n)=1(n)$ ,那么 $(1*\mu)(n)=\sum\limits_{d\mid n}1\cdot\mu(d)=[n=1]$ 。顯然這個卷積的前綴為 $\sum\limits_{i=1}^n(g*\mu)(i)=1(n)$ 。

故對於 $\mu$ $$S(n)=1-\sum_{i=2}^nS\left(\left\lfloor\frac{n}{i}\right\rfloor\right)$$

2. 求 $S(n)=\sum\limits_{i=1}^n\varphi(n)$

上述式子 $$g(1)S(n)=\sum_{i=1}^n(g*\varphi)(i)-\sum_{i=2}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)$$

考慮到 $\sum\limits_{d\mid n}\varphi(d)=n$ ,又由於 $(g*\varphi)(n)=\sum\limits_{d\mid n}g(d)\varphi\left(\frac{n}{d}\right)$ 。我們考慮讓 $g(n)=1(n)$ ,那么 $(1*\varphi)(n)=\sum\limits_{d\mid n}1\cdot\varphi(d)=n$ 。顯然這個卷積的前綴為 $\sum\limits_{i=1}^n(g*\varphi)(i)=\frac{n(n+1)}{2}$ 。

故對於 $\varphi$ $$S(n)=\frac{n(n+1)}{2}-\sum_{i=2}^nS\left(\left\lfloor\frac{n}{i}\right\rfloor\right)$$

2.3 二項式系數

1、
2、
3、
證明:由
當 $a = b = 1$ 時,代入二項式定理可證明 $1$ 式;
當 $a = -1$ , $b = 1$ 時代入二項式定理可證明 $2$ 式;代入 $a = 1$ , $b = -1$ 可得到另一個意義相同的式子;
 $(1式+2式) \over 2$ 可證明 $3$ 式。

2.4 Lucas定理

2.4.0 Lucas

$C^m_n\equiv C^{\left\lfloor\frac{m}{p}\right\rfloor}_{\left\lfloor\frac{n}{p}\right\rfloor} \times C^{m \mod p} _{n \mod p} \pmod{p}$ , $p$ 為質數。

證明:需要用到多項式同余的那套理論,然而我並不會。

2.4.1 擴展 Lucas

一般的 $Lucas$ 是在模數 $p$ 是質數的條件下適用的。我們來考慮 $p$ 不是質數的條件。

我們對 $p$ 進行唯一分解,記 $p=p_1^{k_1}p_2^{k_2}\cdots p_q^{k_q}$ ,由於形同  $p_i^{k_i}$ 的部分是互質的,顯然我們可以用 $CRT$ 合並。

列出方程組: $\left\{ \begin{array}{c} ans\equiv c_1\pmod {{p_1}^{k_1}}\\ ans\equiv c_2\pmod {{p_2}^{k_2}}\\ ...\\ ans\equiv c_q\pmod {{p_q}^{k_q}}\\ \end{array} \right. $ ,對於每個 $c_i$ ,表示 $C_n^m$ 在 $\mod p_i^{k_i}$ 下的結果。由解的唯一性,我們可以證明這個 $ans$ 就是我們要求的。
根據 $C_n^m=\frac{n!}{m!(n-m)!}$ 我們只要求出 $n!\mod p_i^{k_i},m!\mod p_i^{k_i},(n-m)!\mod p_i^{k_i}$ ,再用逆元的那套理論就可以求 $c_i$ 了。

考慮如何求 $n!\mod p_i^{k_i}$ 。容易發現 $n!=\left(\prod\limits_{j=1}^n j^{[p_i\nmid j]}\right)\cdot\left(p_i^{\left\lfloor\frac{n}{p_i}\right\rfloor}\right)\cdot\left(\left\lfloor\frac{n}{p_i}\right\rfloor\large! \right)$ 上述式子分為三個部分,第一個部分顯然在模 $p_i^{k_i}$ 下,是以 $p_i^{k_i}$ 為周期的。可以周期內找循環節算,周期外的暴力算;第二部分可以直接算;第三部分可以遞歸求解。

另外注意的是求組合逆元的時候,存在階乘中的某一個數可能還有 $p_i$ 這個質因子,不能直接算。直接把 $p_i$ 全部提出來,最后求完逆元后再補回去。求 $n!$ 內質因子 $p$ 的個數可以用 $\sum\limits_{i=1}^{+\infty} \left\lfloor\frac{n}{p^i}\right\rfloor$ 來求。

 1 LL quick_pow(LL a, LL b, LL p) {
 2     LL ans = 1;
 3     while (b) {
 4         if (b&1) ans = ans*a%p;
 5         b >>= 1, a = a*a%p;
 6     }
 7     return ans;
 8 }
 9 void ex_gcd(LL a, LL b, LL &x, LL &y) {
10     if (b == 0) {x = 1, y = 0; return; }
11     ex_gcd(b, a%b, x, y);
12     LL t = x; x = y, y = t-a/b*y;
13 }
14 LL inv(LL a, LL p) {
15     LL x, y; ex_gcd(a, p, x, y);
16     return (x%p+p)%p;
17 }
18 LL mul(LL n, LL pi, LL pk) {
19     if (!n) return 1;
20     LL ans = 1;
21     for (int i = 2; i <= pk; i++) if (i%pi != 0) ans = ans*i%pk;
22     ans = quick_pow(ans, n/pk, pk);
23     for (int i = 2; i <= n%pk; i++) if (i%pi != 0) ans = ans*i%pk;
24     return ans*mul(n/pi, pi, pk)%pk;
25 }
26 LL C(LL n, LL m, LL pi, LL pk, LL p) {
27     LL a = mul(n, pi, pk), b = mul(m, pi, pk), c = mul(n-m, pi, pk);
28     LL k = 0;
29     for (LL i = n; i; i /= pi) k += i/pi;
30     for (LL i = m; i; i /= pi) k -= i/pi;
31     for (LL i = n-m; i; i /= pi) k -= i/pi;
32     return a*inv(b, pk)%pk*inv(c, pk)%pk*quick_pow(pi, k, pk)%pk;
33 }
34 LL ex_lucas(LL n, LL m, LL p) {
35     LL ans = 0;
36     for (LL i = 2, x = p; i <= x; i++)
37         if (x%i == 0) {
38             LL k = 1; while (x%i == 0) k *= i, x /= i;
39             (ans += C(n, m, i, k, p)*(p/k)%p*inv(p/k, k)%p) %= p;
40         }
41     return ans;
42 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM