1. 程式人生 > 其它 >【筆記】莫比烏斯反演/篩法

【筆記】莫比烏斯反演/篩法

來自\(\texttt{Sharpness}\)省選複習計劃中的莫比烏斯反演/篩法


例題1

線性篩素數,每個數只會被它最小質因子篩掉,藉此我們可以線性求出很多積性函式如$\mu\ ,\ \varphi $等。

例題2

整除分塊,給定\(n\),則\(\left\lfloor\dfrac{n}{i}\right\rfloor\)的取值不超過\(\sqrt{N}\)種,因為\(i\le \sqrt{N}\)時不超過\(\sqrt{N}\)種取值,\(>\sqrt{N}\)時也不超過\(\sqrt{N}\)

所以我們可以把所有\(\left\lfloor\dfrac{n}{i}\right\rfloor\)

相同的\(i\)分到一段。總共不超過\(\sqrt{N}\)段。

整除分塊的寫法可以直接套用。

程式碼

例題3

\([L,R]\)選出\(N\)個數使得他們的\(\gcd=K\)。不妨將所有數\(/k\),將問題轉換為在\([L',R']\)中選取\(N\)個數使得\(gcd=1\)。顯然這可以直接暴算了。

題目給出\(R-L\le10^5\),考慮更簡單的方法。我們可以先求出\(f[i]\)表示公約數為\(i\)的方案數,再通過\(f[k\times i],k\in N^{+}\),容斥求出最大公約數為\(i\)的方案數。

程式碼


迪利克雷卷積

\(h=f*g\),則有\(h(n)=\sum\limits_{d|n}f(d)g(\dfrac{n}{d})\)

性質 \(1\):若\(f,g\)為積性函式,則\(f*g\)也為積性函式。

證明:

  • 如果$p\perp q $,則 \(w|pq\)\(w=uv,u|p\land v|q\)一一對應 。因為\(w\)的每一個質因子可以唯一分配到 \(p\) 或者 \(q\) 中。
  • 所以\(h(p\times q)=\sum\limits_{w|pq}f(w)g(\dfrac{pq}{w})=\sum\limits_{u|p,v|q}f(u)f(v)g(\dfrac{p}{u})g(\dfrac{q}{v})=h(p)h(q)\)

反演

性質 \(2\)\(\mu *1=\epsilon\)

應用:\(\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|i,j}\mu(d)\\=&\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}\)

性質 \(3\)\(\varphi*1=\rm Id\)

應用:\(\begin{aligned} \sum\limits_{i=1}^{n}\sum\limits_{j=1}^m\gcd(i,j)=& \sum\limits_{i=1}^{n}\sum\limits_{j=1}^m\sum\limits_{d|i,j}\varphi(d)\\=&\sum\limits_{d=1}^{\min(n,m)}\varphi(d)\left\lfloor\dfrac{n}{d}\right\rfloor\left\lfloor\dfrac{m}{d}\right\rfloor \end{aligned}\)


例題4

莫比烏斯反演模板題。

利用性質 \(2\) ,用線性篩預處理\(\mu\),然後整除分塊可以做到\(\rm O(T\sqrt{N})\)

程式碼

例題5

經典 \(\texttt{trick}\) : \(\sigma(ij)=\sum\limits_{a=1}^{i}\sum\limits_{b=1}^{j}[\gcd(a,b)=1]\)

然後利用性質\(2\)求解即可。

程式碼


杜教篩

杜教篩用來在優於線性的時間複雜度內求出積性函式的字首和。

如果我們需要求積性函式 \(f\) 的字首和 \(S\),我們可以找一個合適的函式 \(g\),令\(h=f*g\)

\[\begin{aligned}\sum\limits_{i=1}^nh(i)=& \sum\limits_{i=1}^{n}\sum\limits_{d|i}g(d)f(\dfrac{i}{d}) \\=& \sum\limits_{d=1}^ng(d)\sum\limits_{i=1}^{\frac{n}{d}}f(i)\\=&\sum\limits_{d=1}^n g(d)S(\dfrac{n}{d})\end{aligned}\]

所以有

\[\sum\limits_{i=1}^nh(i)-\sum\limits_{d=2}^n g(d)S(\dfrac{n}{d})=g(1)S(n) \]

如果我們選取的\(g\)函式能使得\(\sum h(i)\)快速求出,我們可以將這個問題遞迴分解下去。由問題\(S(n)\)分解到\(S(\dfrac{n}{d})\)。並不難得到一個時間複雜度為\(\rm O(N^{\frac{3}{4}})\)

考慮優化,我們可以將所有\(\le M\)\(S(i)\) 全部篩出來,不難證得當\(M=N^{\frac{2}{3}}\)時,時間複雜度最優且為\(\rm O(N^{\frac{2}{3}})\)


例題6

利用\(\mu,\varphi\)函式的性質。\(\mu *1=\epsilon\)\(\varphi*1=\rm Id\),其中函式 \(1,\epsilon,\rm Id\) 的字首和都可以 \(\rm O(1)\) 求得,直接套用上面的公式即可。

程式碼

例題7

轉化一下,發現我們需要求\(\sum\limits_{i=1}^{n}i^2\varphi(i)\)

根據套路,我們令\(f(n)=n^2\varphi(n)\)\(g(n)=n^2\)。令\(h=f*g\),有:

\[\begin{aligned}h(n)=&\sum\limits_{d|n}f(d)g(\frac{n}{d})\\=&n^2\sum\limits_{d|n}\varphi(d)\\=&n^3\end{aligned} \]

\(g,h\)的字首和都非常好求,而\(f\)又是個積性函式,所以直接上杜教篩即可。

程式碼

好現在你已經精通莫反和基礎篩法了,試著完成下面的練筆吧XD。

T1程式碼

T2程式碼