1. 程式人生 > 其它 >Redis學習之Redis叢集模式缺陷及其處理

Redis學習之Redis叢集模式缺陷及其處理

Min_25篩

例題題面

\(f(x)\)是一個積性函式,且\(f(p^k)=p^k(p^k-1)\),求\(\sum_{i=1}^n f(i)\),其中\(n\leq 10^{10}\)

題解

Min_25篩的基本思想:積性函式\(f(p^k)\)能表示成一個關於\(p^k\)的多項式,於是可以對每一項分別去處理。在此題中是一個二次的多項式。所以說,我們接下來的過程其實是在求這樣一個式子:

\[\sum_{i=1}^nf(i),f(p^e)=(p^e)^k \]

其中的\(f\)\(k\)均有別於上面的\(f\)\(k\)

我們考慮將原式分成兩部分:

\[\begin{aligned} \sum_{i=1}^n f(i)&=\sum_{1\leq p \leq n}f(p)+\sum_{i∉prime}f(i)\\ &=\sum_{1\leq p \leq n}f(p)+\sum_{p\leq\sqrt{n} \&p^e\leq n}f(p^e)\sum_{i\leq\frac{n}{p^e}\&minp>p}f(i) \end{aligned} \]

其中前面那部分是質數,後面那部分是列舉合數。

我們先考慮第一部分怎麼解決。

Part1

我們考慮一個dp:設\(g(n,j)\),滿足:

\[g(n,j)=\sum_i[i∈prime||minp>p_j]i^k \]

其中顯然的,\(i^k\)是一個完全積性函式。

在此題中,明顯的,\(k\)\(1\)\(2\)

接下來考慮轉移,我們可以發現,如果從\(g(n,j-1)\)轉移到\(g(n,j)\),我們就要刪掉原本最小質因子是\(p_{j}\)的數,那麼就有下面的轉移:

\[g(n,j)=g(n,j-1)-p_j^k(g(\frac{n}{p_j},j-1)-g(p_{j-1},j-1)) \]

其中前面那個就是最小質因子是\(p_j\)

的所有數和質數,後面那個就是為了抵消掉質數。

不難發現,\(g(p_{j-1},j-1)\)即為前\(j-1\)個質數的\(k\)次方和,這個可以篩法搞一下,記為\(sp_{j-1}\)

於是,我們就能求出\(1\)~\(n\)中所有質數的k次方和,即為\(g(n,x)\),其中\(x\)是滿足\(p_x\leq \sqrt n\)的最大的\(x\)。為方便記為\(g(n)\)

但是你會發現一個事兒,\(n\)太大,沒辦法把每一個\(g(n)\)都存下來。但是我們發現,我們需要的\(n\)都是由\(n\)除以某個數得到的,不難發現這樣的值最多隻有\(O(\sqrt n)\)種,於是就可以存下來了。

Part2

類似地考慮dp,設\(S(n,x)\)\(1\)\(n\)中所有最小質因子大於\(p_x\)的數的函式(即\(f\))值之和,那麼答案就是\(S(n,0)+1\)。(1為\(f(1)\)的值)

\(S\)分成兩部分,一部分為質數,一部分為合數,則有:

\[S(n,x)=g(n)-sp_x+\sum_{p_k^e\leq n\&k>x}f(p_k^e)(S(\frac{n}{p_k^e},k)+[e\neq1]) \]

前面那一半就是質數,後面的和式就是合數了。這個類似於上面\(g\)那條式子。後面那個\(e\neq1\)是因為\(e=1\)的時候在質數裡算過了。

這個式子就可以遞迴去處理了。

經典trick

因為在處理\(g\)的時候,減去\(p_j^k(g(\frac{n}{p_j},j-1)-g(p_{j-1},j-1))\)意義即為將最小質因數為\(p_j\)的合數的函式值給去掉,所以這一部分的和就是全部合數的函式值的和。

例:【51NOD1847】奇怪的數學題