杜教篩
…因為網頁崩潰導致要重寫一遍……
首先看一道板子題:bzoj 3944 https://www.cnblogs.com/lokiii/p/8329320.html
要求在低於線性的時間內莫比烏斯函數和歐拉函數的前綴和。因為都是積性函數,所以這裏以mu為例。設 \( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\mu(i)\) ,然後很顯然對於mu \(g(n)=1 \),對於phi \( g(n)=n*(n+1)/2 \),然後可以這樣轉化一下:
\[
g(n)=\sum_{i=1}^{n}\sum_{d|n}\mu(d)
\]
\[ =\sum_{d=1}^{n}\mu(d)\left \lfloor \frac{n}{d} \right \rfloor \]
\[ =\sum_{d=1}^{n}s(\left \lfloor \frac{n}{d} \right \rfloor) \]
\[ s(n)=g(n)-\sum_{d=2}^{n}s(\left \lfloor \frac{n}{d} \right \rfloor) \]
然後遞歸求解子問題即可。
類似的題還有:
51nod 1224 https://www.cnblogs.com/lokiii/p/8334589.html
51nod 1239 https://www.cnblogs.com/lokiii/p/8333844.html
其實是一樣的但是時間卡的比較死。
通過這些題可以發現杜教篩的套路就是把一個問題轉換為幾個形式相同但範圍更小的問題遞歸求解,從而做到低於線性的復雜度。子問題的構造一般是用一個叫狄利克雷卷積的東西,不過我比較習慣瞎推,因為套路就那麽幾個,推起來也方便。
以下整理一些常見的推導套路:
1、
\[
\sum_{d|n}\mu(d)=0(n!=1)
\]
證明:
\[ \sum_{i=0}^{k}C_k^i(-1)^k=(1-1)^k \]
2、設F(n)為1到n中無平方因子數的個數
\[ F(n)=\sum_{i=1}^{\sqrt{n}}\mu(i)\left \lfloor \frac{n}{i^2} \right \rfloor \]
3、設 \( f(d)=\sum_{k|d}\mu(k)k \),p為質數
\[ f(p^k)=f(p)=1-p \]
4、
\[ \sum_{d|n}\mu(d)\frac{n}{d}=\phi(d) \]
證明:
\[ \phi(n)=\sum_{i=1}^{n}[gcd(i,n)==1] \]
\[ =\sum_{i=1}^{n}\sum_{d|i,d|n}\mu(d) \]
\[ =\sum_{d|n}\mu(d)\left \lfloor \frac{n}{d} \right \rfloor=\sum_{d|n}\mu(\left \lfloor \frac{n}{d} \right \rfloor)d \]
5、設 d為約數個數 ,\( d(ij)=\sigma_0(ij) \)
\[ d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1] \]
例:bzoj 4176 https://www.cnblogs.com/lokiii/p/8331366.html
6、設 d為約數個和,\( d(ij)=\sigma_1(ij) \)
\[ d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \]
例:51nod 1220 https://www.cnblogs.com/lokiii/p/8334216.html
7、\[ |\mu(n)|==1 \]
\[ \phi(nk)=\sum_{d|n,d|k}\phi(\frac{n}{d})\phi(k ) \]
\[ \mu(n)==0 \]
\[ s(n,m)=\frac{n*s(k,m)}{k} \]
例:bzoj 3512 https://www.cnblogs.com/lokiii/p/8330148.html
8、對於積性函數f,t為約數個數,ki為約數冪,pi為第i個約數:
\[ \sum_{d|n}f(d)=\prod_{i=1}^{t}\sum_{j=0}^{k_i}f(p_i^j) \]
9、
\[ d|ij=d|\frac{d}{gcd(i,d)} \]
10、
\[ \sum_{i=1}^{n}\phi(i^2)=\sum_{i=1}^{n}i\phi(i) \]
例:bzoj 4916 https://www.cnblogs.com/lokiii/p/8330788.html
11、對於任意積性函數構造子問題形式。這裏以mu為例,設\( f(i)=\mu(i)i^k \),\( s(n)=\sum_{i=1}^{n}f(i) \),\( g(n)=\sum_{i=1}^{n}\sum_{d|i}i^k\mu(d) \) ,對於mu,\( g(n)=\sum_{i=1}^{n}i^k \);對於phi,\( g(n)=\sum_{i=1}^{n}i^{k+1} \)
有如下推導:
\[ g(n)=\sum_{i=1}^{n}\sum_{d|i}i^k\mu(d) \]
\[ g(n)=\sum_{i=1}^{n}\sum_{d=1}^{i-1}[d|i]i^k\mu(d)+s(n) \]
\[ s(n)=g(n)-\sum_{i=1}^{n}\sum_{d=1}^{i-1}[d|i]i^k\mu(d) \]
\[ s(n)=g(n)-\sum_{j=1}^{n}j^k\sum_{d=1}^{\left \lfloor \frac{n}{j} \right \rfloor}d^k\mu(d) \]
\[ s(n)=g(n)-\sum_{j=1}^{n}j^ks(\left \lfloor \frac{n}{j} \right \rfloor) \]
例:51nod 1238 https://www.cnblogs.com/lokiii/p/8334512.html
bzoj 4916 https://www.cnblogs.com/lokiii/p/8330788.html
12、打表找規律可得:
\[ \sum_{i=1}^{n}\sum_{j=1}^{i}[gcd(i,j)==1]ij=\sum_{i=1}^{n}i\frac{i\phi(i)+[i==1]}{2} \]
例:51nod 1238 https://www.cnblogs.com/lokiii/p/8334512.html
51nod 1227 https://www.cnblogs.com/lokiii/p/8327746.html
13、設\( f(n)=\sum_{i=1}^{n}i \)
\[ \sum_{i=1}^{n}f(\left \lfloor \frac{n}{i} \right \rfloor) \]
\[ =\sum_{i=1}^{n}\sum_{j=1}^{\left \lfloor \frac{n}{i} \right \rfloor}j \]
\[ =\sum_{i=1}^{n}\sum_{j=1}^{\left \lfloor \frac{n}{i} \right \rfloor}j \]
\[ =\sum_{j=1}^{n}j\left \lfloor \frac{n}{j} \right \rfloor \]
例:51nod 1220 https://www.cnblogs.com/lokiii/p/8334216.html
14、
\[ \sum_{i=1}^{n}\sum_{j=1}^{n}[gcd(i,j)==1] \]
\[ 2\sum_{i=1}^{n}\phi(i)-1 \]
例:51nod 1237 https://www.cnblogs.com/lokiii/p/8320975.html
時間復雜度就不介紹了 我不會啊,據說預處理前 n^{\frac{2}{3}} +記憶化的部分復雜度可以達到 O(n^{\frac{2}{3}}) 。
結果這篇只有前面一點點是杜教篩其他都是套路啊
杜教篩