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

0 寫在前面

0.0 前言

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

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

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

感謝你的造訪。數組

0.1 記號說明

因爲該文完成的間隔跨度太大,不一樣時期的內容的寫法不嚴謹,甚至 $LaTeX$ 也有許多不規範的表達。我懶也不想改...請見諒...svg

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$ 的公因子。ui

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

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$ 則這組方程有無數組解,不然無解。.net

求出一組 $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 二項式係數

一、
二、
三、
證實:由
當 $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 }
相關文章
相關標籤/搜索