侵刪
以下內容均來自TA爺課件,我只是改了幾個小的地方qwq
請關閉瀏覽器的極速模式后閱讀(極速模式顯示的公式為什么辣么粗糙啊qwq)
枚舉除法
- \(\left\lfloor\frac{n}{i}\right\rfloor\)只有\(O\left(\sqrt{n}\right)\)種取值。
- 對於\(i\),\(\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\)是與\(i\)被\(n\)除並下取整取值相同的一段區間的右端點。
- 一個很有用的性質:\(\left\lfloor\frac{n}{ab}\right\rfloor=\left\lfloor\frac{\left\lfloor\frac{n}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor\frac{\left\lfloor\frac{n}{b}\right\rfloor}{a}\right\rfloor\)
- 上取整也有3所述的性質。
積性函數
- \(f(ab)=f(a)f(b),(a,b)=1\)
- 完全積性:不要求\((a,b)=1\)
- 考慮時一般會考慮成\(f(x)=\prod\limits_{i}f\left(p_i^{k_i}\right)\)
- 當\(f\)不是0的常值函數時,\(f(1)=1\)
- 積性函數的狄利克雷前綴和也是積性函數。
- 兩個積性函數的狄利克雷卷積也是積性函數。
- 積性函數可以線性篩出。線篩可以找到每個數\(x\)的最小質因子\(p_1\)及其次數\(k_1\)。如果我們能以較小的代價(\(O(1)\))求出\(f\left(p_1^{k_1}\right)\),便可以線篩了。
初等積性函數\(\mu\)
- 栗子:給定\(n\),\(m\),求\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[i\bot j],n,m \leqslant 10^9\),不用\(\mu\)怎么做?
容斥!設dp數組\(f(i,j)\)為當\(n=i,m=j\)時的答案。
時間復雜度\(O\left(\sum\limits_{i=1}^{\left\lfloor\sqrt{n}\right\rfloor}\left(\sqrt{\left\lfloor\frac{n}{i}\right\rfloor}+\sqrt{i}\right)\right)=O\left(n^{\frac{3}{4}}\right)\)
那么\(\mu\)是什么?就是容斥系數!
\(\mu\)顯然是一個積性函數。
2. $$\sum\limits_{d|n}\mu(d)=\left{\begin{array}{rcl}1&,&n=1\0&,&n\neq1\end{array}\right.$$
3. 莫比烏斯反演
- 回到栗子:
當然這樣還是做不了。。。
所以我們需要杜教篩!(后面再說吧。。)
不過大多數\(\mu\)的題(第一步)這么化,所以這個式子還是比較重要的。
初等積性函數\(\varphi\)
- \(\varphi(n)=1~n與n互質的數的個數\)
所以由定義便可直接寫出:
這樣就可以線篩出來了,而且可以看出\(\varphi\)是一個積性函數。
2. 從剛才的式子可以看出,\(\varphi\)完全可以用\(\mu\)代替,那么我們為什么需要\(\varphi\)呢?
很大一部分原因是它定義比較直觀,比較容易想到。
3. \(\varphi\)的性質:$$\sum\limits_{d|n}\varphi(d)=\sum\limits_{d|n}d\sum\limits_{g|\frac{n}{d}}\mu(g)=n$$
4. 栗子:求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m(i,j)\),多組數據,\(t,n,m\leqslant 10^5\)。
杜教篩
- 求\(\sum\limits_{i=1}^n\mu(i),n\leqslant 10^{11}\)
直接求不好求,但是我們有\(\sum\limits_{i=1}^n\sum\limits_{d|i}\mu(d)=1\)
化一下蛤:\(\sum\limits_{i=1}^n\sum\limits_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}\mu(j)=1\),\(\sum\limits_{i=1}^n\mu(i)=1-\sum\limits_{i=2}^n\sum\limits_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}\mu(j)\)
核心思想是枚舉約數,這樣就可以遞推/遞歸求解了。
時間復雜度\(O\left(n^{\frac34}\right)\)。
但是注意到當\(n\)比較小的時候其實我們可以\(O(n)\)線篩出來。
所以我們考慮分類討論,線篩出≤B的,>B的遞推。
時間復雜度\(O\left(B+\sum\limits_{i=1}^{\frac nB}\sqrt{\frac ni}\right)=O\left(B+\frac n{\sqrt{B}}\right)\)
求導一下可知在\(B=n^{\frac23}\)時取得最小值\(O\left(n^\frac23\right)\)。 - 回到栗子:這樣的話最初的栗子就會做了吧~
注意到杜教篩的時候不僅是求出了\(\sum\limits_{j=1}^n\mu(j)\),還順便求出了所有的\(\sum\limits_{j=1}^{\left\lfloor\frac ni\right\rfloor}\mu(j)\),所以可以和普通的枚舉除法完美契合。
3. 那么怎么求\(\sum\limits_{i=1}^n\varphi(i)\)?
下面講些題吧~(不一定都是反演哦)
- 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\leq10^{11}\)
如果我們可以杜教篩出\(\sum\limits_{i=1}^n\mu(i)i^2\),就可以做到\(O\left(n^{\frac34}\right)\)。
這是可以的
但是我們當然不必這么做。
可以直接令\(f(n,m)\)表示(1~n,1~m)中所有互質數對乘積和。
那么\(f(n,m)=\frac{n(n+1)m(m+1)}4-\sum\limits_{i=2}^{\min(n,m)}i^2f\left(\left\lfloor\frac ni\right\rfloor,\left\lfloor\frac mi\right\rfloor\right)\),直接dp就好了。
但是我們需要\(O\left(n^\frac 23\right)\)
枚舉除法,我們便只需求\(\sum\limits_{i=1}^ni\sum\limits_{d|i}\mu(d)d\)
它等於\(\sum\limits_{i=1}^ni\sum\limits_{j=1}^{\left\lfloor\frac ni\right\rfloor}\mu(j)j^2\)
我們先求出\(\sum\limits_{i=1}^n\mu(i)i^2\)
這個剛才已經講過了。
然后前者便可以預處理+直接求。
預處理的時候需要線性篩
這題中涉及一種很重要的杜教篩的思路。
就是對於不能直接杜教篩的式子,可以將其與另一個前綴和易求的積性函數狄利克雷卷積,使得卷積后的函數前綴和也易求。
比如這道題就是與\(f(x)=x^2\)卷積。
這道題也涉及到一些常見的化式子的方法。
\(\gcd\to\mu\),\(\mu\to\varphi\)
對於i,j,ij三項貢獻的這種,可以枚舉ij將其化為狄利克雷卷積,也可以枚舉i和j化成帶下取整的式子;一般來講前者往往易於預處理,可以應付多組詢問,后者則在單次詢問中有優秀表現。
2. SDOI2015 約數個數和
求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^md(i,j)\),多組數據,\(T,n,m\leq10^5\),\(d(i,j)=\sum\limits_{x|i}\sum\limits_{y|j}[x\bot y]\)
預處理\(O\left(n\log n\right)/O\left(n\sqrt n\right)\),查詢\(O\left(T\sqrt n\right)\)
3. BZOJ2820 YY的gcd
求\((x,y)=質數\),\(x\in[1,n]\),\(y\in[1,m]\)的數對個數。多組數據,\(n,m\leq10^7\),\(T\leq10^4\)
預處理\(O(n)/O(n\lg\lg n)\),查詢\(O(T\sqrt n)\)
4. FZU2016 how many tuples
有m個數,第i個數的取值范圍是\([1,a_i]\),求這m個數gcd為1的方案數。多組數據,10s時限,\(t\leq10^3\),\(m\leq20\),\(ai\leq10^8\)
直接杜教篩就可以了,杜教篩的時候預處理\(10^7\)。
枚舉除法的時候需要用堆。時間復雜度\(O\left(Tm\sqrt A\log m\right)\)
5. CQOI2015 選數
求從\(\left[L,R\right]\)中選N個數,其gcd等於K的方案數。\(N,K,L,R\leq10^9\),\(R-L\leq10^5\)
如果N個數互不相同,那么gcd至多是R-L,所以我們分情況討論。
所以設\(f(i)\)表示gcd是K*i的方案數,要求\(\left\lfloor\frac R{iK}\right\rfloor-\left\lfloor\frac{L-1}{iK}\right\rfloor>1\)
最后再加上\([L\leq K\leq R]\)
時間復雜度\(O\left((R-L)\log K\right)\)