1. 定義
1.1 基礎定義
- 數論函式:定義域為正整數的函式稱為數論函式。因其在所有正整數處均有定義,故可視作數列。
- 加性函式:若 \(\forall a,b\in\mathbb{N}^{+},a\perp b,f(ab)=f(a)+f(b)\),則稱 \(f\) 為加性函式。
- 積性函式:若 \(\forall a,b\in\mathbb{N}^{+},a\perp b,f(ab)=f(a)f(b)\),則稱 \(f\) 為積性函式。
- 完全積性函式:若 \(\forall a,b\in\mathbb{N}^{+},f(ab)=f(a)f(b)\),則稱 \(f\) 為完全積性函式。
- 數論函式的加法:對於數論函式 \(f,g\),\(f+g\) 表示對應位置相加,即 \((f+g)(x)=f(x)+g(x)\)。
- 數論函式的數乘:對於數 \(c\) 和數論函式 \(f\),\(c\cdot f\) 表示 \(f\) 的各個位置乘 \(c\),即 \((c\cdot f)(x)=c\cdot f(x)\),一般簡記為 \(cf\)。
- 數論函式的點乘:對於數論函式 \(f,g\),\(f\cdot g\) 表示 \(f\) 和 \(g\) 各個位置相乘,即 \((f\cdot g)(x)=f(x)g(x)\),通常不省略。
1.2 常見數論函式
-
單位函式:\(\varepsilon(n)=[n=1]\)。它是完全積性函式。
-
常數函式:\(\boldsymbol 1(n)=1\)。它是完全積性函式。
-
恆等函式:\(\text{id}_{k}(n)=n^{k}\)。\(\text{id}_1(n)\) 記作 \(\text{id}(n)\)。它是完全積性函式。
-
除數函式:\(\sigma_k(n)=\sum\limits_{d\mid n}d^k\)。\(\sigma_0(n)\) 表示 \(n\) 的約數個數,記作 \(\tau(n)\) 或 \(d(n)\)。\(\sigma_1(n)\) 表示 \(n\) 的約數和,記作 \(\sigma(n)\)。
-
尤拉函式:\(\varphi(n)=\sum\limits_{i=1}^{n}[i\perp n]\)。表示 \(n\) 以內與 \(n\) 互質的個數,是積性函式。
-
本質不同質因子個數函式:\(\omega(n)=\sum\limits_{p\in\mathbb{P}}[p\mid n]\)。表示 \(n\) 的本質不同質因子個數,是加性函式。
-
莫比烏斯函式:\(\mu(n)=\begin{cases}1&n=1\\0&\exists d>1,d^2\mid n\\(-1)^{\omega(n)}&\mathrm{otherwise} \end{cases}\)。
2. 線性篩
在 \(O(n)\) 的時間內篩出某些玩意。
2.1 線性篩素數
保證每個數只被最小質因子篩掉。
inline void getPrime(){
int w=N-1;
for(int i=2;i<=w;i++){
if(!vis[i])
pr[++tot]=i;
for(int j=1;j<=tot and i*pr[j]<=w;j++){
vis[i*pr[j]]=1;
if(i%pr[j]==0)
break;
}
}
}
2.2 線性篩莫比烏斯函式
\(\mu(1)=1\);\(i\) 為質數時 \(\mu(i)=-1\),最小質因子篩到的時候比 \(i\) 多了一個質數所以反過來。
inline void getMu(){
int w=N-1;mu[1]=1;
for(int i=2;i<=w;i++){
if(!vis[i]){
pr[++tot]=i;
mu[i]=-1;
}
for(int j=1;j<=tot and i*pr[j]<=w;j++){
vis[i*pr[j]]=1;
if(i%pr[j]==0){
mu[i*pr[j]]=0;
break;
}
mu[i*pr[j]]=-mu[i];
}
}
}
2.3 線性篩尤拉函式
若 \(p\mid n\) 則 \(n\) 含有 \(np\) 所有的質因子,所以 \(\varphi(np)=p\times n\prod\limits_{i=1}^k\left(1-\dfrac{1}{p_i}\right)=p\times\varphi(n)\)。
若 \(p\nmid n\) 則 \(\varphi(np)=\varphi(n)\times\varphi(p)=(p-1)\times\varphi(n)\)。
inline void getPhi(){
int w=N-1;phi[1]=1;
for(int i=2;i<=w;i++){
if(!vis[i]){
pr[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot and i*pr[j]<=w;j++){
vis[i*pr[j]]=1;
phi[i*pr[j]]=phi[i]*(pr[j]-(i%pr[j]?1:0));
if(i%pr[j]==0)
break;
}
}
}
2.4 線性篩約數個數
令 \(n=\prod\limits_{i=1}^kp_i^{a_i}\),則 \(\tau(n)=\prod\limits_{i=1}^k(a_i+1)\)。
只要記錄每個數最小質因數的指數。
inline void getTau(){
int w=N-1;T[1]=1;
for(int i=2;i<=w;i++){
if(!vis[i]){
pr[++tot]=i;
T[i]=2;a[i]=1;
}
for(int j=1;j<=tot and i*pr[j]<=w;j++){
vis[i*pr[j]]=1;
if(i%pr[j]){
T[i*pr[j]]=T[i]*T[pr[j]];
a[i*pr[j]]=1;
}else{
T[i*pr[j]]=T[i]/(a[i]+1)*(a[i]+2);
a[i*pr[j]]=a[i]+1;
break;
}
}
}
}
3. 狄利克雷卷積
狄利克雷(Dirichlet)卷積是數論函式的基本運算。
3.1 定義和性質
定義狄利克雷卷積為
簡記為 \(h=f*g\)。按照定義式計算狄利克雷卷積,時間複雜度為調和級數 \(\mathcal{O}(n\ln n)\)。
狄利克雷卷積有如下幾個性質:
- 狄利克雷卷積具有 交換律,結合律,分配律。
- \(\varepsilon*f=f\)。 因此單位函式 \(\varepsilon\) 為狄利克雷卷積的 單位元,也可以定義數論函式的逆元 \(f^{-1}\) 滿足 \(f*f^{-1}=\varepsilon\)。
- 數論函式 \(f\) 存在逆元 當且僅當 \(f(1)\) 非零。
- \(f=g\) 的充要條件是 \(f*h=g*h\),其中數論函式 \(h(x)\) 要滿足 \(h(1)\) 非零。
- 積性函式的狄利克雷卷積是積性函式。
- 積性函式的逆元是積性函式。綜合性質 5 和性質 6,可以得到兩個積性函式的積與商都是積性函式。
3.2 狄利克雷字首和
任意數論函式 \(f\) 卷常數函式 \(\boldsymbol 1\) 等價於對 \(f\) 做狄利克雷字首和,即:令 \(g=f*\boldsymbol 1\),則 \(g(n)=\sum\limits_{d\mid n}f(d)\)。
將每個 \(n\) 寫成無窮序列 \(a_n=\{c_1,c_2,\cdots,c_i,\cdots\}\) 表示 \(n=\prod p_i^{c_i}\),其中 \(p_i\) 表示第 \(i\) 個質數。因為 \(x\mid y\) 的充要條件為 \(a_x(c_i)\leq a_y(c_i)\),所以 \(f*\boldsymbol 1\) 可以看成對下標做關於其無窮序列的高維字首和,即:\(g(n)=\sum\limits_{\forall i,a_d(c_i)\leq a_n(c_i)}f(d)\)。
實現方法:初始令 \(x_i=f(i)\)。行銷到達列舉每個質數 \(p_i\),列舉 \(k\),將 \(x_{p,k}\) 加上 \(x_k\),相當於 \(k\) 貢獻到 \(a_k(i)\) 加上 \(1\) 之後的下標。最終得到的 \(x\) 即為 \(g\)。
根據小於 \(n\) 的素數倒數和為 \(\ln\ln n\) 這一結論,狄利克雷字首和的時間複雜度為 \(\mathcal{O}(n\ln\ln n)\)。
const int N=2e7+5;
int n,vis[N],pr[N>>3],tot;
unsigned ans,a[N],seed;
inline void getPrime(){
for(int i=2;i<=n;i++){
if(!vis[i])
pr[++tot]=i;
for(int j=1;j<=tot and i*pr[j]<=n;j++){
vis[i*pr[j]]=true;
if(i%pr[j]==0)
break;
}
}
}
inline unsigned getnext(){
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return seed;
}
signed main(){
cin>>n>>seed;
getPrime();
for(int i=1;i<=n;i++)
a[i]=getnext();
for(int i=1;i<=tot;i++)
for(int j=1;j*pr[i]<=n;j++)
a[j*pr[i]]+=a[j];
for(int i=1;i<=n;i++)
ans^=a[i];
cout<<ans<<'\n';
return 0;
}
4. 數論分塊
4.1 演算法介紹
數論分塊又稱整除分塊,因其解決的問題與整除密切相關而得名。數論分塊用於求解形如
的和式。前提為 \(f\) 的字首和可以快速計算。
引理1
\[\forall a,b,c\in\mathbb{Z}, \left\lfloor\dfrac{a}{bc}\right\rfloor= \left\lfloor\dfrac{\left\lfloor\frac{a}{b}\right\rfloor}{c}\right\rfloor \]
證明:
引理2
\[\forall n\in\mathbb{N}_+, \left\lvert\left\{ \left\lfloor\dfrac{n}{d}\right\rfloor \mid d\in\mathbb{N_+},d\leq n\right\}\right\rvert\leq \left\lfloor2\sqrt{n}\right\rfloor \]
證明:
-
對於 \(d\leq \left\lfloor\sqrt{n}\right\rfloor\),有 \(\left\lfloor\sqrt{n}\right\rfloor\) 種取值。
-
對於 \(d> \left\lfloor\sqrt{n}\right\rfloor\),有 \(\left\lfloor\frac{n}{d}\right\rfloor\leq\left\lfloor\sqrt{n}\right\rfloor\),也只有$ \left\lfloor\sqrt{n}\right\rfloor$ 種取值。
4.2 數論分塊結論
對於常數 \(n\),使得式子
成立且滿足 \(i\leq j\leq n\) 的 \(j\) 值最大為 \(\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor\),即值 \(\left\lfloor\dfrac ni\right\rfloor\) 所在塊的右端點為 \(\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor\)。
4.3 過程
考慮計算式子
因為 \(\left\lfloor\dfrac{n}{i}\right\rfloor\) 的值成塊狀分佈,那麼就可以用數論分塊加速計算。具體地先求出 \(f\) 的字首和 \(s\),然後每次以 \([l,r]=\left[l,\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor\right]\) 為一塊,分塊求出貢獻累加到結果中。
每個整除值會且僅會被遍歷一次,時間複雜度為 \(\mathcal O(\sqrt n)\)。
當 \(i\) 的上界不為 \(n\) 時,設其為 \(m\),則當 \(n>m\) 時 \(r\) 應與 \(m\) 取較小值,當 \(n<m\) 時特盤 \(\left\lfloor\dfrac ni\right\rfloor=0\) 的情況並令 \(r\leftarrow m\)。
4.4 擴充套件
4.4.1 向上取整
對於常數 \(n\),使得式子
成立且滿足 \(i\leq j\leq n\) 的 \(j\) 值最大為 \(\left\lfloor\dfrac {n-1}{\lfloor\frac {n-1}i\rfloor}\right\rfloor\),即值 \(\left\lceil\dfrac ni\right\rceil\) 所在塊的右端點為 \(\left\lfloor\dfrac {n-1}{\lfloor\frac {n-1}i\rfloor}\right\rfloor\)。
4.4.2 高維數論分塊
當式子中出現若干下取整,形如
時,令 \(r=\min\limits_{j=1}^c\left(\left\lfloor\dfrac{n_j}{\left\lfloor\frac{n_j} l\right\rfloor}\right\rfloor\right)\) 即可。對 \(n\) 取 \(\min\)。時間複雜度為 \(\mathcal O\left(\sum\sqrt{n_j}\right)\)。
5. 莫比烏斯函式
對 \(\mathbb N\) 做容斥,得到貢獻係數為 \(\mu\)。
5.1 莫比烏斯反演
\(\mu*1=\varepsilon\) 引出了 \(\mu\) 的關鍵性質:\([n=1]=\varepsilon(n)=\sum\limits_{d\mid n}\mu(d)\)。這使得我們可以用 \(\mu\) 的和式代替形如 \(\left[n=x\right]\) 的的艾佛森括號,體現出其反演的核心。
一些結論:
- 若 \(g(n)=\sum\limits_{d\mid n}f(d)\),則 \(f(n) = \sum\limits_{d\mid n} \mu(d) f\left(\dfrac n d\right)\),即若 \(g=f*1\),則 \(f=g*u\)。
- 若 \(g(n) = \sum\limits_{n\mid d} f(d)\),則 \(f(n) = \sum\limits_{n\mid d} \mu\left(\dfrac d n\right) g(d)\),因為 \(\sum\limits_{n\mid d} \mu\left(\dfrac d n\right) \sum\limits_{d\mid k} f(k) = \sum\limits_{n\mid k} f(k) \sum\limits_{d\mid \frac k n} \mu(d) = f(n)\)。
- 因為 \(\varphi * \boldsymbol1 = \mathrm{id}\),所以 \(\mathrm{id} * \mu = \varphi\),即 \(\sum\limits_{d \mid n} \dfrac n d \mu(d) = \varphi(n)\),或 \(\sum\limits_{d\mid n} \dfrac{\mu(d)} d = \dfrac {\varphi(n)} n\)。
5.2 常見技巧
\[\begin{aligned} \sum\limits_{i = 1} ^ n \sum\limits_{j = 1} ^ m [\gcd(i, j) = 1] & = \sum\limits_{i = 1} ^ n \sum\limits_{j = 1} ^ m \sum\limits_{d\mid \gcd(i, j)} \mu(d) \\ & = \sum\limits_{d = 1} ^ {\min(n, m)} \mu(d) \sum\limits_{i = 1} ^ n \sum\limits_{j = 1} ^ m [d\mid i\land d\mid j] \\ & = \sum\limits_{d = 1} ^ {\min(n, m)} \mu(d) \left\lfloor \dfrac n d \right\rfloor \left\lfloor \dfrac m d \right\rfloor \\ \end{aligned} \]
相當於對 “最大公約數為 \(d\) 的倍數” 中的 \(d\) 做容斥,加上最大公約數為 \(1\) 的倍數的對數,減去最大公約數為 \(p_i\) 的倍數的對數,加上最大公約數為 \(p_ip_j\) 的倍數的對數,以此類推,得到每個 \(d\) 的貢獻係數即莫比烏斯函式。
\[\tau(ij) = \sum\limits_{x \mid i}\sum\limits_{y\mid j}[\gcd(x,y)=1] \]
考慮把每個因子一一對映。
如果 \(ij\) 的因子 \(k\) 中有一個因子 \(p^c\),\(i\) 中有因子 \(p^a\),\(j\) 中有因子 \(p^b\)。我們規定:
- 如果 \(c\leq a\),那麼在 \(i\) 中選擇。
- 如果 \(c>a\),那麼把 \(c\) 減去 \(a\),在 \(j\) 中選擇 \(p^{c-a}\)。
對於 \(ij\) 的因子 \(k\) 的其他因子同理。於是對於任何一個 \(k\) 都有一個唯一的對映,且每一個選擇對應著唯一的 \(k\)。
透過如上過程,我們發現:對於 \(ij\) 的因子 \(k=\prod p_i^{c_i}\),不可能同時在 \(i\) 和 \(j\) 中同時選擇 \(p_i\)(優先在 \(i\) 中選擇,如果不夠就只在 \(j\) 中選擇不夠的指數),所以 \(x,y\) 互質。
5.3 例題
以下所有分式均省略下取整符號。題單
I. P2522 [HAOI2011] Problem b
求:
二維差分將式子下界化為 \(1\),然後推式子:
莫反得
列舉約數 \(d\),記 \(c=\min\left(\dfrac{n}{k},\dfrac{m}{k}\right)\),
由於 \(1\sim x\) 中 \(y\) 的倍數有 \(\dfrac{x}{y}\) 個,故將式子化為
整除分塊即可。時間複雜度為 \(\mathcal O\left(n+T\sqrt n\right)\)。
II. SP5971 LCMSUM - LCM Sum
求:
將 \(\text{lcm}\) 化為 \(\gcd\):
線性篩出 \(\boldsymbol 1 * (\mathrm{id} \times \varphi)\) 可以做到 \(\mathcal{O}(n + T)\)。
III. P2398 GCD SUM
求:
根據 \(\varphi *\boldsymbol 1=\text{id}\),有
整除分塊即可,時間複雜度為 \(\mathcal O\left(n + \log n\right)\)。
IV. P1390 公約數的和
求:
與 P2398 類似,去重,即去掉 \(\gcd(d,d)=d\) 和 \(\gcd(a,b)=\gcd(b,a)\)。
V. P6810 「MCOI-02」Convex Hull 凸包
求:
直接列舉 \(\gcd\)
令 \(T=dD\)
有 \(\tau * \mu =\boldsymbol 1\)
發現後面一坨式子可以用 Dirichlet 字尾和最佳化,只需要把 Dirichlet 字首和倒著寫就好了。
時間複雜度為 \(\mathcal O\left(\min(n,m)(\log\log n+\log\log m)\right)\)。
VI. P1447 [NOI2010] 能量採集
求:
簡單轉化
中間求和的式子就是 P2398 了。
VII. P2158 [SDOI2008] 儀仗隊
求:
結論一,注意特判 \(n=1\) 的情況。
VIII. P3455 [POI2007]ZAP-Queries
IX. P4450 雙親數
X.P4318 完全平方數
求:\(T\) 組資料,第 \(k\) 個沒有完全平方因子的數。
題目即求解 \(\min x\) 使得
記 \(f(x)=\sum\limits_{i=1}^{x}\mu(i)^2\),不難發現 \(f(x)\) 單調遞增。因此考慮二分。
那麼問題的核心在於求解 \(f(x)\),考慮容斥。因為對 \(\mathbb N\) 做容斥的係數為 \(\mu\),不難得到
時間複雜度為 \(\mathcal O(n + T\sqrt n\log n)\)。
XI. P1829 [國家集訓隊] Crash的數字表格 / JZPTAB
求:
將 \(\text{lcm}\) 化為 \(\gcd\):
記 \(s(n)=\sum_{i=1}^ni=\frac{n(n+1)}2\),先列舉 \(t\)
記 \(T=dt\),先列舉 \(s\)
中間 \(s\) 的部分可以數論分塊做,\(T\sum\limits_{d\mid T}d\mu(T)\) 是個積性函式可以線性篩。
時間複雜度為 \(\mathcal O(n+\sqrt n)\)。
XII. P2257 YY的GCD
求:
列舉 \(\gcd\)
記 \(T=kd\)
先列舉 \(T\)
後面那一坨式子可以預處理。具體地,對於每一個質數 \(k\),將其所有倍數的值加上 \(\mu\left(\dfrac Tk\right)\)。
時間複雜度為 \(\mathcal O(n+T\sqrt n)\)。
XIII. P3327 [SDOI2015] 約數個數和
求:
技巧二,有
將列舉 \(i,j\) 的約數的貢獻,每一個約數都會對它的倍數產生貢獻。
括號內的東西可以整除分塊預處理。時間複雜度為 \(\mathcal O(n+n\sqrt n+T\sqrt n)\)。
XIV. P3911 最小公倍數之和
求:
記 \(c_i\) 為 \(i\) 出現的次數,則有
第一個括號可以預處理,第二個括號直接暴力計算。時間複雜度為 \(\mathcal O(n\log n)\)。
XV. P3704 [SDOI2017] 數字表格
求:
答案對 \(p=998244353\) 取模。
列舉 \(\gcd\)
指數部分易求
記 \(T=kd\)
括號內可以預處理。
具體地,線性篩 \(\mu\),對於每一個 \(k\) 列舉其倍數 \(T\),乘上 \(\text{fib}_k\) 計算到 \(T\) 的貢獻中。
注意到 \(\mu\) 的取值對貢獻有影響的只有 \(\{1,-1\}\),預處理 \(\text{fib}\) 的逆元即可。
預處理複雜度為 \(\mathcal O(n\log n+n\log p)\),整除分塊複雜度為 \(\mathcal O(T\sqrt n(\log p+\log \frac nT\frac mT))\)。