繡湖新作《The Past Within》明日公開新預告
數論學習筆記
定義
一些概念
- 數論函式(算術函式)
定義域為正整數,陪域為複數的函式。每個算術函式都可視為複數的序列。
最重要的算術函式是積性及加性函式。算術函式的最重要操作為狄利克雷卷積。
- 積性函式
滿足
\[gcd(a, b)=1\quad f(ab)=f(a)f(b) \]則 \(f\) 是積性函式。
同理有加性函式
- 完全積性函式
同理有完全加性函式
- 艾弗森約定(艾佛森括號)
- **符號函式 **
一些數論函式
- 尤拉函式
\(\varphi(n)\) 是小於等於 \(n\) 的正整數中與 \(n\) 互質的數的數目
\[\varphi(n)=\sum\limits_{d\le n}[\gcd(d,n)=1]\\ \varphi(n)=n\times\prod\limits_{P_i\mid n}\frac{P_i-1}{P_i}\qquad P_i\in\mathbb{P} \]- 恆等函式
- 單位函式
- 冪函式
- 單位元函式
- 莫比烏斯函式
- 約數個數函式
- 約數和函式
狄利克雷卷積
定義
卷積(又稱疊積(convolution)、褶積或旋積),是透過兩個函式 \(f\) 和 \(g\) 生成第三個函式的一種數學運算元。狄利克雷卷積是其中的一種。
狄利克雷卷積是定義在數論函式集上的一種二元運算,相當於是在這個定義上的一種乘法,而普通函式加法就是該定義上的加法。
\[(f\ast g)(n)=\sum_{d\mid n}f(d)\cdot g(\frac nd) \]運算
就和一般實數上的乘法與加法十分類似
-
交換律: \(f\ast g=g\ast f\)
-
結合律: \((f\ast g)\ast h=f\ast(g\ast h)\)
-
分配率: \(f\ast (g+h)=f\ast g + f\ast h\)
正如實數中有 \(\forall n,\ 1\times n=n\) 及 \(\forall n\ne0,\ n\times n^{-1}=1\) 一樣,這裡也存在**單位元函式 \(\varepsilon\) **,使得
- \(\forall f,\ f\ast\varepsilon=\varepsilon\ast f=f\)
- \(\forall f(1)\ne0,\ f\ast f^{-1}=\varepsilon\)
定理
一些定理
- 兩個積性函式的狄利克雷卷積一定也是一個積性函式。
一些等式
\[\begin{align*} &I\ast I=d \qquad&(1)\\ &I\ast id=\sigma &(2)\\ &\varphi\ast I=id &(3)\\ &I\ast\mu=\varepsilon &(4) \end{align*} \]證明 \((4)\) :
\[\because \varphi\ast I=id\\ id\ast\mu=\varphi\\ \therefore \varphi\ast I\ast\mu=\varphi=\varphi\ast\varepsilon\\ \therefore I\ast\mu=\varepsilon \]即 \(I\) 與 \(\mu\) 互為反函式, \(I=\mu^{-1},\ \mu=I^{-1}\)
\[\begin{align*} &d(ij)=\sum_{x\mid i}\sum_{y\mid j}[\gcd(x,y)=1]\qquad&(5)\\ &\sum_{d\mid n}\varphi(d)=n &(6)\\ &\mu\ast id=\varphi &(7)\\ \end{align*} \]
證明 \((7)\) :
\[\begin{align*} \because\mu\ast I&=\varepsilon\\ \therefore id\ast\mu\ast I&=id\ast\varepsilon=id\\ \because\varphi\ast I&=id\\ \therefore id\ast\mu&=\varphi \end{align*} \]莫比烏斯反演
性質
莫比烏斯函式不僅是積性函式,還有如下性質:
\[\sum_{d\mid n}\mu(d)= \begin{cases} 1\quad n=1\\ 0\quad n\ne1 \end{cases} \]結論
結論 1
\[F(n)=\sum_{d\mid n}f(d) \implies f=\mu\ast F \]稱數論函式 \(F(n)\) 為數論函式 \(f(n)\) 的莫比烏斯變換,數論函式 \(f(n)\) 為數論函式 \(F(n)\) 的莫比烏斯逆變換(反演)。
證明:
\[\because F(n)=\sum_{d\mid n}f(d)\times1=\sum_{d\mid n}f(d)I(\frac nd)\\ \therefore F=f\ast I\\ \because I\ast\mu=\varepsilon\\ \therefore F\ast\mu=f\ast\varepsilon\\ \therefore f=\mu\ast\varepsilon \]結論 2
\[[P=1]=\sum_{d\mid P}\mu(d) \]證明:
\[\begin{align*} [P=1]&=\varepsilon(P)\\\\ &=(I\ast\mu)(P)\\\\ &=\sum_{d\mid P}\mu(d) \end{align*} \]應用:
例 1
\[[\gcd(i,j)=1]=\sum_{d\mid \gcd(i,j)}\mu(d)=\sum_{d\mid i\and d\mid j}\mu(d) \]模板程式碼
線性篩
許多積性函式對質數有特殊性質,使得我們可以簡單地計算函式值,
同時,又因為任意兩個質數互質,於是我們可以利用質數和數論函式的積性篩出更一般的數的函式值。
使用線性篩可以 \(O(n)\) 地篩出大部分積性函式的值。
尤拉函式
#include <vector>
#include <bitset>
int n, phi[N];
std::vector<int> prime;//篩出的質數
std::bitset<N> cmpst;//composite 合數
inline void Euler() {
cmpst.reset();
phi[1] = 1;//特殊值
for (register int i=2, tmp; i<=n; ++i) {
if (!cmpst[i]) {
prime.push_back(i);
phi[i] = i-1;//質數的phi值
}
for (register int p : prime) {
tmp = i*p;
if (tmp > n) break;
cmpst[tmp] = 1;//標記合數
if (i%p == 0) {//線性篩的核心操作:此時p是i的最小質因數
phi[tmp] = phi[i] * p;
break;
} phi[tmp] = phi[i] * phi[p];//合數的phi值,利用phi的積性
}
}
}
莫比烏斯函式
#include <vector>
#include <bitset>
#define N 50030
int mu[N];
bitset<N> nap;//not a prime
vector<int> prime;
inline void seive(int n = N - 20) {
mu[1] = 1; nap[1] = 1;
for (rg int i=2; i<=n; ++i) {
if (!nap[i]) {
mu[i] = -1;
prime.push_back(i);
}
for (rg int p : prime) {
if (i * p > n) break;
nap[i * p] = 1;
if (i % p == 0) { mu[i * p] = 0; break; }
mu[i * p] = -mu[i];
}
}
}
整除分塊(數論分塊)
對於多組詢問求形如下式的值
\[\sum_{i=1}^n S(\lfloor\frac ki\rfloor)f(i) \]其中 \(S\) 與 \(f\) 都是可以 \(O(1)\) 求值的函式
我們可以使用整除分塊將其從 \(O(n)\) 優化至 \(O(\sqrt n)\) 。
原理:當 \(i\) 在一些區間 \([l,r],\ l,r\in[1,n]\) 中時, \(\lfloor\frac ki\rfloor\) 為定值。
我們可以在預處理中將 \(f\) 字首和為 \(sum\_f\)
已知 \(l,k\) ,我們可以 \(O(1)\) 求出 \(r=\lfloor\frac k{\lfloor \frac ki\rfloor}\rfloor\) 。證明。
特別注意:有時候 \(i>k\) 了就會出現除以 0 的情況。(易知當 \(k\ge n\) 時不會出現)
int ans = 0;
for (int l=1, r; l<=n; l=r+1) {
r = (l > k) ? n : min( k / (k / l), n );
ans += S(l) * ( num_f(r) - sum_f(l-1) );
}
return ans;
典型例題
GCD - Extreme (II)
\(1\le n\le4\times10^6+1\) ,資料組數: \(T\le100\) ,求:
\[\sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j) \]解:
\[\begin{align*} \sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j)&= \sum_{j=1}^n\sum_{i=1}^{j-1}\gcd(i,j)\\ &=\sum_{d=1}^nd\sum_{j=1}^n\sum_{i=1}^{j-1}[\gcd(i,j)=d]\\ &=\sum_{d=1}^nd\sum_{j=1}^{\lfloor\frac nd\rfloor}\sum_{i=1}^{j-1}[\gcd(i,j)=1]\\ \end{align*} \]注意到:
\[\because \varphi(j)=\sum_{i=1}^j[\gcd(i,j)=1]\\ \therefore \sum_{i=1}^{j-1}[\gcd(i,j)=1]= \begin{cases} 0&j=1\\ \varphi(j)\quad&j>1 \end{cases}\\ \]於是我們定義 \(\varphi\) 的從 2 開始的字首和 \(\operatorname{\varphi_s}(x)=\sum\limits_{i=2}^x\varphi(i)\) ,它可以用線性篩篩出來後 \(O(1)\) 求出。
那麼繼續:
\[\begin{align*} \sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j) &=\sum_{d=1}^nd\sum_{j=1}^{\lfloor\frac nd\rfloor}\sum_{i=1}^{j-1}[\gcd(i,j)=1]\\ &=\sum_{d=1}^nd\times\operatorname{\varphi_s}(\lfloor\frac nd\rfloor) \end{align*} \]利用整除分塊,可以做到 \(O(n+T\sqrt n)\)
[NOI2010] 能量採集
本文來自部落格園,作者:Gyan083,轉載請註明原文連結:https://www.cnblogs.com/gyan083/p/15585300.html