1. 程式人生 > 其它 >OI 學習筆記 (1):數論

OI 學習筆記 (1):數論

0x00 前言

本文(可能)包含的內容:

  1. 學習數論的前置知識
  2. 各類數論函式與其性質(和證明)
  3. 如何使用各類篩求積性函式值
  4. 在 OI 題目中的應用

參考資料:

閱讀本文您應該有初中數學水平,如果沒有建議閱讀初一至初三的數學書。

如果文中有數學記號或專有名詞您不懂其意思,請看 0xF0 附件。

0x01 數學雜項

狄利克雷卷積

定義:對於兩個數論函式 \(f,g\)

,他們的狄利克雷卷積 \((f*g)(n)=\sum\limits_{d|n}f(n)g(\frac{n}{d})\),即 \((f*g)(n)=\sum\limits_{ab=n}f(a)g(b)\)

性質:兩個積性函式 \(f,g\) 的狄利克雷卷積也是積性函式。

證明:設 \(h\)\(f,g\) 的狄利克雷卷積,即 \(h(n)=\sum\limits_{d|n}f(n)g(\frac{n}{d})\)\(gcd(x,y)=1\)

\[\begin{aligned} h(x)h(y) &= \sum_{i|x} f(i) g(\frac{x}{i}) \sum_{j|y} f(j) g(\frac{y}{j}) \newline &= \sum_{i|x} \sum_{j|y} f(i) f(j) g(\frac{x}{i}) g(\frac{y}{j}) \newline &= \sum_{i|x} \sum_{j|y} f(ij) g(\frac{xy}{ij}) \newline &= \sum_{d|xy} f(d) g(\frac{xy}{d}) \newline &= h(xy) \end{aligned} \]

證畢。

0x10 數論函式

本 part 記錄了幾種常見的數論函式及其性質(和證明),有一些過於簡單的會放在 0xF2 中。

0x11 尤拉函式

尤拉函式,符號為 \(\varphi\),意為 \(\varphi(n)=\sum\limits_{i=1}^{n-1}[\gcd(i,n)=1]\),即所有小於 \(n\) 的數中有幾個數和 \(n\) 互質。

接下來是性質(和證明),設 \(p \in prime\)

性質1\(\varphi(p)=p-1\),證明顯然。

性質2\(\varphi(p^k)=p^k-p^{k-1}\quad(k \in \mathbb{Z+})\)

證明:\(p^k\)

有且僅有質因數 \(p\),而比它小的 \(p^{k-1}-1\) 個數中,也存在幾個數含有質因數 \(p\)

\(p,2p,3p,\cdots,(p^{k-1}-1)p\),一共有 \(p^{k-1}-1\) 個數。

於是在 \(1 \sim p^k-1\) 中,與 \(p^k\) 互質的數的個數為 \((p^k-1)-(p^{k-1}-1)=p^k-p^{k-1}\)

證畢。

性質3\(\varphi(ax)=a\varphi(x)\quad(a|x)\)

性質4\(\varphi(x)\varphi(y)=xy\quad (\gcd(x,y)=1)\),所以尤拉函式是積性函式。

性質5:設 \(n\) 的質因數分解為 \(\prod\limits_{i=1}^mp_i^{a_i}\),那麼 \(\varphi(n)=n\prod\limits_{i=1}^m(1-\frac{1}{p_i})\)

性質6\(\sum\limits_{d|n}\varphi(d)=n\)

證明:設 \(f(n)=\sum\limits_{d|n}\varphi(d)\),當 \(gcd(x,y)=1\) 時:

\[\begin{aligned} f(x)f(y) &= \sum_{i|x}\varphi(i) \times \sum_{j|y}\varphi(j)\newline &= \sum_{i|x} \sum_{j|y} \varphi(i) \varphi(j)\newline &= \sum_{i|x} \sum_{j|y} \varphi(i \times j)\newline &= \sum_{d|xy} \varphi(d)\newline &= f(xy) \end{aligned} \]

所以 \(f\) 是積性函式,那麼設 \(n\) 的質因數分解為 \(\prod\limits_{i=1}^mp_i^{a_i}\),由 \(f\) 是積性函式可得:

\[f(n) = \prod_{i=1}^mf(p_i^{a_i}) \]

由性質2,可得 \(f(p^c)=\varphi(1)+\varphi(p)+\varphi(p^2)+\cdots+\varphi(p^c)=1+(p-1)+(p^2-p)+\cdots+(p^c-p^{c-1})=p^c\)

所以 \(f(n)=\prod_{i=1}^mf(p_i^{a_i})=\prod_{i=1}^mp_i^{a_i}=n\)

原命題得證。

證畢。

0x12 莫比烏斯函式

莫比烏斯函式,符號為 \(\mu\),定義如下:

\[\left\lbrace \begin{aligned} 1 & & n=1 \newline (-1)^m & & n=\prod\limits_{i=1}^mp_i^{a_i},a_{1\sim n}=1 \newline 0 & & otherwise \newline \end{aligned} \right. \]

性質1\(\mu(x)\mu(y)=\mu(xy)\quad(\gcd(x,y)=1)\)

證明:如果 \(x = 1\)\(y = 1\),顯然。

如果 \(\mu(x) = 0\)\(\mu(y) = 0\),顯然。

否則 \(\mu(x) \mu(y) = (-1)^{m_x} (-1)^{m_y} = (-1)^{m_x+m_y} = \mu(xy)\)

證畢。

性質2\(\sum\limits_{d|n}\mu(d)=\epsilon(n)\)

證明:與尤拉函式的性質6證明類似。

0x20 篩法

本 part 記錄了幾種常見的篩法篩積性函式和素數的方法。

0x21 埃拉託斯特尼篩法(埃氏篩)

篩質數

考慮如果一個數 \(x\) 是合數,那麼 \(x\) 的倍數也是合數,所以如果我們從小到大考慮每個數,然後同時把當前這個數的所有(比自己大的)倍數記為合數,那麼執行結束的時候沒有被標記的數就是素數了。

CI N = 2e5; bool Mx[N + 5];
void Eratosthenes (int n) {
	RI i, j; Mx[1] = 1; for (i = 2; i <= n; ++ i) if (! Mx[i]) for (j = 2; i * j <= n; ++ j) Mx[i * j] = 1;
}

時間複雜度 \(O(n\log\log n)\)

0x22 線性篩(尤拉篩)

考慮到埃氏篩一個合數可能被篩多遍,如果省掉無意義的步驟,複雜度就降為 \(O(n)\) 了。

篩質數

CI N = 2e5; int P[N + 5], Nt; bool Mx[N + 5];
void Euler (int n) {
	RI i, j; for (i = 2; i <= n; ++ i) for (! Mx[i] && (P[++ Nt] = i), j = 1; j <= Nt && i * P[j] <= n; ++ j) if (Mx[i * P[j]] = 1, ! (i % P[j])) break;
}

篩尤拉函式

根據尤拉函式的如下性質:

  • \(\varphi(p)=p-1\quad(p \in prime)\)
  • \(\varphi(x\times p)=\varphi(x)\times p\quad(p\mid x)\)
  • \(\varphi(x\times p)=\varphi(x)\times(p-1)\quad(\gcd(p,x)=1)\)

可以在篩質數的同時篩出尤拉函式。

CI N = 1e5; int P[N + 5], Pt, phi[N + 5], n; bool Mx[N + 5];
void C (int d)
{
	RI i, j; phi[1] = 1; for (i = 2; i <= d; ++ i) for (! Mx[i] && (P[++ Pt] = i, phi[i] = i - 1), j = 1; j <= Pt && i * P[j] <= d; ++ j) {
		if (Mx[i * P[j]] = 1, ! (i % P[j]) && (phi[P[j] * i] = phi[i] * P[j], 1)) break;
		else phi[i * P[j]] = phi[i] * (P[j] - 1);
	}
}

篩莫比烏斯函式

CI N = 1e5; int P[N + 5], Pt, mu[N + 5], n; bool Mx[N + 5];
void C (int d)
{
	RI i, j; mu[1] = -1; for (i = 2; i <= d; ++ i) for (! Mx[i] && (P[++ Pt] = i, mu[i] = -1), j = 1; j <= Pt && i * P[j] <= d; ++ j) {
		if (Mx[i * P[j]] = 1, ! (i % P[j]) && (mu[P[j] * i] = 0, 1)) break;
		else mu[i * P[j]] = -mu[i];
	}
}

0x30 例題

P2158 [SDOI2008] 儀仗隊

思路

顯然,如果一個座標 \((x,y)\)\(\gcd(x,y) \ne 1\),那麼這個點一定會被 \((\frac{x}{\gcd(x,y)},\frac{y}{\gcd(x,y)})\) 這個點擋住。那麼,這個式子就很顯然了:

\[\sum_{x=1}^n \sum_{y=1}^n [\gcd(x,y)=1] \]

這個式子可以拆成三部分:

\[\sum_{x=1}^n \sum_{y=1}^{x-1} [\gcd(x,y)=1] + \sum_{x=1}^n \sum_{y=x}^{x} [\gcd(x,y)=1] + \sum_{x=1}^n \sum_{y=x+1}^{n} [\gcd(x,y)=1] \]

其中因為對於所有 \((x,x)\) 的點,都會被 \((2,2)\) 擋住,所以中間這部分為 \(1\)。由影象可知,式子前後兩部分是對稱的,所以這個式子可以化簡為:

\[2\sum_{x=1}^n \sum_{y=1}^{x-1} [\gcd(x,y)=1] + 1 \]

\(\sum_{y=1}^{x-1} [\gcd(x,y)=1]\) 這部分剛好是 \(\varphi\) 的定義,所以最終式子為:

\[2\sum_{x=1}^n \varphi(x) + 1 \]

可以先線性篩篩出 \(1 \sim n\) 的尤拉函式,然後 \(O(n)\) 統計答案。

P2398 GCD SUM

\[\sum_{i=1}^n \sum_{j=1}^n \gcd(i,j)\qquad (0) \]

通過尤拉函式的性質,可以將這個式子化簡為:

\[\begin{aligned} (0) &= \sum_{i=1}^n \sum_{j=1}^n \sum_{d | gcd(i,j)} \varphi(d)\newline &= \sum_{i=1}^n \sum_{j=1}^n \sum_{d | i,d | j} \varphi(d)\newline &= \sum_{i=1}^n \sum_{j=1}^n \sum_{d=1}^n \varphi(d) [d | i] [d | j]\newline &= \sum_{d=1}^n \varphi(d) \sum_{i=1}^n \sum_{j=1}^n [d | i] [d | j]\newline &= \sum_{d=1}^n \varphi(d) \lfloor \frac{n}{d} \rfloor^2 \end{aligned} \]

這樣就可以 \(O(n)\) 解決問題了,可以再套一個整除分塊,但是 \(n \le 10^5\),所以沒必要。

P3455 [POI2007]ZAP-Queries

假設 \(b \ge a\),那麼題目顯然讓我們求

\[\sum_{i=1}^a \sum_{j=1}^b [\gcd(i,j) = x] \]

\(x\) 除掉,得:

\[\sum_{i=1}^{\lfloor\frac{a}{x}\rfloor} \sum_{j=1}^{\lfloor\frac{b}{x}\rfloor} [\gcd(i,j) = 1] \]

根據莫比烏斯函式的性質,得:

\[\sum_{i=1}^{\lfloor\frac{a}{x}\rfloor} \sum_{j=1}^{\lfloor\frac{b}{x}\rfloor} \sum_{d|\gcd(i,j)} \mu(d) \]

\(d\) 改為列舉 \(d\) 的形式,得:

\[\sum_{i=1}^{\lfloor\frac{a}{x}\rfloor} \sum_{j=1}^{\lfloor\frac{b}{x}\rfloor} \sum_{d=1}^{\lfloor\frac{a}{x}\rfloor} \mu(d) [d | \gcd(i,j)] \]

發現 \(\sum\limits_{d=1}^{\lfloor\frac{a}{x}\rfloor} \mu(d)\) 可以提到前面去,得:

\[\sum_{d=1}^{\lfloor\frac{a}{x}\rfloor} \mu(d) \sum_{i=1}^{\lfloor\frac{a}{x}\rfloor} \sum_{j=1}^{\lfloor\frac{b}{x}\rfloor} [d | \gcd(i,j)] \]

如果 \([d | \gcd(i,j)] = 1\),那麼 \(i,j\) 都要是 \(d\) 的倍數,於是得:

\[\sum_{d=1}^{\lfloor\frac{a}{x}\rfloor} \mu(d) \lfloor\frac{a}{xd}\rfloor \lfloor\frac{b}{xd}\rfloor \]

由於有多組資料,所以套一個整除分塊,複雜度 \(O(T\sqrt n)\),其中 \(T\) 為資料組數,\(n\)\(\min(a,b)\)

0xF0 附件

0xF1 算式中出現的符號及其含義

符號 含義 例子
\(x \mid y,x \nmid y\) 前者為 \(y\) 整除 \(x\),即 \(x\)\(y\) 的因數;後者與前者相反 \(1 \mid 2,2\mid6 ,4\mid 20,3 \nmid 4,4 \nmid 9\)
\(\gcd(x,y)\) \(x\)\(y\) 的最大公因數 \(\gcd(2,4)=2,\gcd(3,7)=1\)
\(\sum\) 求和,具體見例子 \(\sum\limits_{i=1}^na_i=a_1+a_2+\cdots+a_n,\sum\limits_{d\mid n}d=n的所有因數相加\)
\(\prod\) 求積,具體見例子 \(\prod\limits_{i=1}^n a_i=a_1 \times a_2 \times \cdots \times a_n\)
\(\forall\) 所有滿足某條件的數 \(\forall x\mid y\)\(x\) 的取值範圍為 \(y\) 的因數,或 \(y\) 的因數集合
\([A]\) 如果 \(A\) 為 false,那麼 \([A]=0\);如果 \(A\) 為 true,那麼 \([A]=1\) \([2\mid 3]=0,[\gcd(2,4)=2]=1,[1=0]=0\)
\(\lfloor x \rfloor\) 向下取整 \(\lfloor 1.2 \rfloor = 1,\lfloor 4.9 \rfloor = 4,\lfloor 5 \rfloor = 5\)

0xF2 描述中出現的專有名詞或字母含義

  • 數論函式: 指在整數集中定義的函式。
  • 積性函式:如果數論函式 \(f\),對於滿足 \(\gcd(x,y)=1\)\(\forall x,y\)\(f(x)f(y)=f(xy)\) ,那麼 \(f\) 就是一個積性函式。
  • \(\mathbb{Z}\):指整數集,\(\mathbb{Z+}\) 指正整數集。
  • \(\epsilon\):單位函式,定義為 \(\epsilon(1)=1,\epsilon(n)=0\quad(n\ge2)\)
  • \(Id\):單位函式,定義為 \(Id(n)=n\)