最近在搞積性函數篩法之類的東西,選了幾道有意思的題放在這裏。
有公式恐懼症的勿看!
嘩啦啦。編程
一句話題意:求\(\sum_{i=1}^n p_{smax}(i)\),\(n\leq 10^{11}\)
其中\(p_{smax(i)}\)表示某個數的次大質因子,定義質數和\(1\)的\(p_{smax}=0\)。數組
min_25篩的簡單應用。
先在第一步的時候把質數個數\(g(n,|P|)\)給篩出來,而後進第二步。
第二步時,若當前在狀態\(S(n,j)\),強制當前層選的質因子爲最大質因子,而後用\(p_{j-1}\)貢獻答案。
注意特判最大質因子和次大質因子相同的狀況。
結合上述思路,容易寫出轉移方程:
\(S(n,j) = p_{j-1}(\ g(n,|P|)-(j-1)\ ) + \sum_{k=j}^{|P|} \sum_{e=1}^{p_{k}^{e+1}\leq n} (S(\lfloor \frac{n}{p_k^e} \rfloor ,k+1) + p_k)\)。函數
一句話題意:線性篩出 \(G(T) = \sum_{d|T}\mu(\frac{T}{d}) f(d)\) ,\(T\leq 10^7\)。
其中\(f(d)\)定義爲\(d\)惟一分解後的最大指數冪,如\(f(2^33^55^4) = 5,f(17^43^{18})=18\)。spa
這個題是真的有意思。
考慮惟一分解:\(T=p_1^{c_1}p_2^{c_2}...p_k^{c_k}\),\(d=p_1^{b_1}p_2^{b_2}...p_k^{b_k}\)。
顯然\(\mu(\frac{T}{d})=0\)的項沒有貢獻,因此有貢獻的項必定知足\(c_i-b_i\leq 1\) 。
若存在\(c_i < c_j\),則\(b_i \leq b_j\) 。
此時\(f(d)\)的取值與\(b_i\)的取值無關,而\(c_i-b_i=0\)或\(1\)時在\(\mu(\frac{T}{d})\)中的貢獻剛好相反。
因此這種狀況下存在對稱性,即\(\sum_{d|T} \mu(\frac{T}{d}) f(d) = 0\) 。
若\(c_1=c_2=...c_k=c\),若存在\(b_i<b_j\),則相似上面的對稱性,貢獻會爲\(0\)。
惟一不存在對稱性的狀況是\(b_1=b_2=...b_k=c-1\),此時\(f(d)\)相比其反面少\(1\)。
故此時\(\sum_{d|T} \mu(\frac{T}{d}) f(d) = (-1)^{k+1}\)。
因此線性篩的同時記錄最大指數冪\(g\),經過判斷\(g[\frac{i}{low(i)}]\) 與 \(g[low(i)p_j]\) 是否相同進行轉移。遞歸
兩句話題意:給定一張\(n\times n\)的表格,每一個位置有一個值\(f(a,b)\),知足:
對於正整數\(a,b\),有\(f(a,b)=f(b,a)\)且\(bf(a,a+b)=(a+b)f(a,b)\)。
初始\(f(a,b)=ab\)。如今有\(m\)次操做\((a,b,x,k)\),
每次操做你須要將\(f(a,b)\)改成\(x\),並修改整個表格使得表格合法,
在修改完後,你須要輸出前\(k\)行前\(k\)列表格中的數字之和,數據範圍\(n\leq 10^6,m\leq 10^4\)。數學
首先把條件化爲\(\frac{f(a,b)}{ab} = \frac{f(a,a+b)}{a+b}\)。
這能夠看做一個類歐過程,故\(\frac{f(a,a\%b)}{a(a\%b)} = \frac{f(a,b)}{ab}\),展開後有\(\frac{f(a,b)}{ab} = \frac{f(d,d)}{d^2},d=gcd(a,b)\)
答案爲\(Ans = \sum_{a=1}^K\sum_{b=1}^K f(a,b)\)。
帶入上面的展開式後稍微化簡一下有:\(Ans = \sum_{d=1}^K f(d,d) G(\lfloor \frac{K}{d} \rfloor)\)。
其中\(G(n) = \sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)=1]ij\),而後這題誤導性最強的地方就在這裏。
正常想法確定是反演,然而若是去反演那就完蛋了到死也作不出來,正確姿式應該是:
\(G(n) = \sum_{i=1}^n i \sum_{j=1}^n [gcd(i,j)=1]j = 1+2\sum_{i=2}^n i(\frac{\varphi(i)}{2}i) = \sum_{i=1}^n i^2 \varphi(i)\) 。
最後的問題在於維護\(f(d,d)\)的前綴和,要求可以\(O(\sqrt{n})\)修改,\(O(1)\)回答。分塊就好了。io
一句話題意:求\(\sum_{i=1}^n \sum_{j=1}^n sgcd(i,j)^k\),\(n\leq 10^9 , k\leq 50\)。
其中\(sgcd(i,j)\)表示\(i\)和\(j\)的次小公因數。class
其實這題還蠻簡單的,畢竟太套路了,沒啥思惟含量......
顯然\(sgcd(i,j) = \frac{gcd(i,j)}{p_{min}(gcd(i,j))}\)。
因此枚舉\(gcd(i,j)=d\),
列出式子後能夠獲得:\(Ans = \sum_{d=1}^{n} (\frac{d}{p_{min}(d)})^k \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} [gcd(i,j)=1]\)
而後用對稱性稍微弄一下就能夠獲得:
\[Ans = \sum_{d=1}^{n} (\frac{d}{p_{min}(d)})^k(2 \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\varphi(i)-1)\]
爽!用min_25篩預先解決\(\sum_{i=1}^d(\frac{i}{p_{min}(i)})^k\),而後對於\(\sum_{i=1}^n \varphi(i)\)直接杜教篩便可。循環
一句話題意:\(T\)次詢問\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\)。\(n,m\leq 10^5\) ; \(T\leq 10^4\)。構造函數
常見套路先把\(\varphi(ij)\)寫開能夠獲得:\(Ans = \sum_{d=1}^n \frac{d}{\varphi(d)} \sum_{i=1}^n \sum_{j=1}^n \varphi(i) \varphi(j) [gcd(i,j)=d]\)。
不要把\(gcd=d\)變爲\(gcd=1\),而是直接莫比烏斯反演能夠獲得:
\[Ans = \sum_{i=1}^n (\sum_{d|i} \frac{d}{\varphi(d)} \mu(\frac{i}{d})) G(\lfloor \frac{n}{i} \rfloor , i) G(\lfloor \frac{m}{i} \rfloor)\]
其中\(G(n , K) = \sum_{i=1}^n \varphi(iK)\) 。
前面的一坨\(F(i) = \sum_{d|i} \frac{d}{\varphi(d)} \mu(\frac{i}{d})\)顯然是個迪利克雷卷積,線性篩出來就好了。
關於\(G\)如何求,妙哉妙哉!注意到\(iK\leq n\),因此暴力全算出來就好了,複雜度調和級數。
而後\(Ans = \sum_{i=1}^n F(i) G(\lfloor \frac{n}{i} \rfloor ,i) G(\lfloor \frac{m}{i} \rfloor ,i)\),如何快速求答案?
又是妙哉妙哉,咱們設\(H(U,n,m) = \sum_{i=1}^n F(i) G(n,i) G(m,i)\)。
而後咱們設置一個閥值\(B\),將\(n,m\leq B\)的\(H\)所有預先算出來存到一個數組裏去。
咱們用預處理好\(H\)加上數論分塊算好全部\(n,m\leq B\)的答案。
對於\(n,m > B\) 的部分,由於有\(\frac{n}{i}> B\),因此\(i\leq \lfloor \frac{n}{B} \rfloor\)不會很大,這部分直接暴力算。
那麼此時複雜度變爲了\(O(B^2n + T(\sqrt{n} + \lfloor \frac{n}{B} \rfloor ))\),\(B\)取\(T^{\frac{1}{3}}\)左右便可獲得可行的複雜度。
一句話題意: 求\(K\)進制下,\(\sum_{x=1}^n \sum_{y=1}^m [\)\(\frac{x}{y}\)爲純循環小數\(]\)。\(n,m\leq 10^9\),\(K\leq 2000\)。
小學"奧術"學過純循環小數的處理:存在\(t\),使得\(\frac{K^tx-x}{y} = k\)。
因此\(K^tx = ky + x\)。因此\(K^t \% y = 1\)。
因此\(Ans = \sum_{x=1}^n \sum_{y=1}^m [x \perp y][K\perp y]\),下面一題多解:
爲了節省篇幅,設\(f_s(n)=\sum_{i=1}^n [i\perp K] = \lfloor \frac{n}{K} \rfloor \varphi(K) + brute(n \%K)\)
解1:(暴力拆\([x\perp y]\))
\(Ans = \sum_{x=1}^n \sum_{y=1}^n [K\perp y] \sum_{d|gcd(x,y)} \mu(d)\)
$Ans = \sum_{d=1}^n \mu(d) \sum_{x=1}^{\lfloor \frac{n}{d} \rfloor } \sum_{y=1}^{\lfloor \frac{m}{d} \rfloor} [K \perp yd] $
$Ans = \sum_{d=1}^n \mu(d)[K\perp d] \sum_{x=1}^{\lfloor \frac{n}{d} \rfloor } \sum_{y=1}^{\lfloor \frac{m}{d} \rfloor} [K \perp y] = \sum_{d=1}^n \mu(d) [K \perp d] \lfloor \frac{n}{d} \rfloor f_s(\lfloor \frac{m}{d} \rfloor) $
\(f(n,K) = \sum_{d=1}^n \mu(d)[K\perp d] = \sum_{d=1}^n \mu(d) \sum_{s|K,s|d}\mu(s)\)
\(f(n,K) = \sum_{s|K} \mu(s) \sum_{i=1}^{\lfloor \frac{n}{s} \rfloor} \mu(si) = \sum_{s|K} \mu(s)^2 \sum_{i=1}^{\lfloor \frac{n}{s} \rfloor} f(\lfloor \frac{n}{s} \rfloor , s)\)
遞歸處理便可,終態\(f(n,1)\)直接杜教篩。
QaQ一下,duang~~~
解2:(暴力拆\([K\perp y]\))
\(g(n,m,K) = \sum_{x=1}^n \sum_{y=1}^m [x\perp y] \sum_{d|K,d|y} \mu(d)\)
\(g(n,m,K) = \sum_{d|K} \mu(d) \sum_{x=1}^n \sum_{i=1}^{\lfloor \frac{m}{d} \rfloor} [x\perp id]\)
\(g(n,m,K) = \sum_{d|K} \mu(d) \sum_{i=1}^{\lfloor \frac{m}{d} \rfloor} \sum_{x=1}^n [x\perp i] [x\perp d] = \sum_{d|K} \mu(d) g(\lfloor \frac{m}{d}\rfloor ,n,d)\)
遞歸處理便可,終態\(g(n,m,1)\)直接數論分塊+杜教篩處理。
QwQ一下,duang~~~
解3:(某 高姓一本爺神仙 的作法)
拿着這道題去問\(gzy\)這題怎麼算複雜度啊?min_25篩作是否是假的啊?
而後神仙就給了我這個神仙作法,
該作法時間複雜度僅\(O(\sqrt{n} + n^{\frac{2}{3}})\),不管時間複雜度仍是編程複雜度都吊打了一切題解。
回到解法一的中間:求\(\sum_{d=1}^n f(d) = \sum_{d=1}^n \mu(d) [K\perp d]\)。
咱們構造函數\(g(d) = [d\perp K]\),\(f,g\)都積性,故用\(f(d)\)與\(g(d)\)構造迪利克雷卷積。
\(\sum_{i=1}^n h(i) = \sum_{i=1}^n \sum_{d|i} f(d) g(\frac{i}{d}) = \sum_{i=1}^n \sum_{d|i} \mu(d) [K\perp d][K\perp \frac{i}{d}]\)
\(\sum_{i=1}^n h(i) = \sum_{i=1}^n \sum_{d|i} \mu(d) [K \perp i] = \sum_{i=1}^n [K\perp i] \sum_{d|i} \mu(d)\)。
\(\sum_{i=1}^n h(i) = \sum_{i=1}^n [K\perp i][i=1] = \sum_{i=1}^n [i=1]\)。
故\(h(i) = [i=1]\),寫完整:\(\sum_{i=1}^n [i=1] = \sum_{i=1}^n \sum_{d|i} \mu(d) [K\perp d][K\perp \frac{i}{d}]\)
因此直接杜教篩便可:\(\sum_{i=1}^n f(i) = 1 - \sum_{i=2}^n [i\perp K]\sum_{j=1}^{\lfloor \frac{n}{i} \rfloor} f(j)\)。 這個解法真的太妙了!這構造真的神了,無論你怎麼以爲,反正我是當場直接給跪了。