日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Min_25 筛小结

發(fā)布時(shí)間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Min_25 筛小结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Min_25 篩這個(gè)東西,完全理解花了我很長(zhǎng)的時(shí)間,所以寫點(diǎn)東西來(lái)記錄一些自己的理解。

它能做什么

對(duì)于某個(gè)數(shù)論函數(shù) \(f\),如果滿足以下幾個(gè)條件,那么它就可以用 Min_25 篩來(lái)快速求出這個(gè)函數(shù)的前綴和。

  • 它是一個(gè)積性函數(shù)

  • 對(duì)于一個(gè)質(zhì)數(shù) \(p\)\(f(p)\) 的表達(dá)式必須是一個(gè)項(xiàng)數(shù)比較小的多項(xiàng)式。即 \(\displaystyle f(p) = \sum a_ip^{b_i}\)

  • 對(duì)于一個(gè)質(zhì)數(shù) \(p\)\(f(p^k)\) 的表達(dá)式必須可以由 \(f(p)\) 快速得到。

  • 看起來(lái)這些條件比較緊,其實(shí)仔細(xì)想想許多函數(shù)還是滿足這些性質(zhì)的。接下來(lái)討論它的實(shí)現(xiàn)過(guò)程。

    實(shí)現(xiàn)過(guò)程

    Min_25 篩的核心思想就是對(duì)于 \(\le n\) 的數(shù)中,除掉質(zhì)數(shù)之后,每個(gè)數(shù)的最小質(zhì)因子大小不超過(guò) \(\sqrt{n}\) 。即類似埃氏篩的方式,從每個(gè)質(zhì)因子篩掉一部分的貢獻(xiàn)。整個(gè)過(guò)程可以分成三部分,即質(zhì)數(shù)的部分的貢獻(xiàn)之和與合數(shù)的部分的貢獻(xiàn)和,以及 \(1\) 的特判。

    記號(hào)約定

    這里用 \(P\) 表示質(zhì)數(shù)集合,\(P_i\) 表示第 \(i\) 小的質(zhì)數(shù)。

    質(zhì)數(shù)部分

    首先我們不妨設(shè) \(f(p) = p^k\) 。對(duì)于更加一般的項(xiàng)數(shù)小的多項(xiàng)式形式,我們可以分別記每一個(gè)項(xiàng)的貢獻(xiàn),然后分別相加。注意到這里 \(f(p)\) 是一個(gè)完全積性函數(shù)。對(duì)于 \(p\) 為合數(shù)的情況,為了方便,我們先姑且同樣定義 \(f(p) = p^k\) ,到最后你會(huì)明白這樣定義的原因。

    我們?cè)僭O(shè) \(g(n,i)\) 表示 \(\le n\) 的所有數(shù) \(x\) 中,\(x\) 的最小質(zhì)因子 \(> P_i\) 或者 \(x\) 本身為質(zhì)數(shù)的所有 \(f(x)\) 之和,這樣 \(g(n,|P|)\) 就是所有質(zhì)數(shù)的貢獻(xiàn)之和了。而 \(g(n,0)\) 的答案也十分顯然,即 \(\displaystyle \sum_{i = 2} ^{n} i^k\) 。我們只需要考慮,如何從 \(g(*,i - 1)\) 如何得到 \(g(*,i)\)

    考慮我們從 \(i - 1\) 推到 \(i\) 的過(guò)程中,會(huì)減少哪個(gè)部分的貢獻(xiàn),容易發(fā)現(xiàn)最小質(zhì)因子恰好為 \(P_i\) 的貢獻(xiàn)被減掉了。如果 \(P_i^2 > n\) ,那么這一部分是沒(méi)有貢獻(xiàn)的,即 \(g(n,i) = g(n,i - 1)\)

    對(duì)于 \(P_i^2 \le n\) 的情況,我們需要把所有 \(P_i\) 的倍數(shù),且滿足其最小質(zhì)因子除去 \(P_i\) 之外 \(> P_{i-1}\) 的貢獻(xiàn)全部減掉。如果直接減去 \(f(P_i) \cdot g(\lfloor\frac{n}{P_i}\rfloor,i - 1)\) 你會(huì)發(fā)現(xiàn)貢獻(xiàn)是減多了的,原因就是 \(g\) 函數(shù)的值還包含了所有質(zhì)數(shù)的貢獻(xiàn)之和,仔細(xì)分析一下,可以發(fā)現(xiàn),對(duì)于 \(x = P_iP_j(j < i)\) 的貢獻(xiàn)在 \(j\) 這個(gè)地方已經(jīng)減過(guò)了,所以還要加回來(lái),即 \(\displaystyle f(P_i) \cdot g(P_i - 1,i - 1) = \sum_{j = 1}^{i - 1} f(P_i)f(P_j)\)

    式子匯總起來(lái)也就是
    \[ g(n,i) = \begin{cases} g(n,i-1) & P_i^2>n \\ g(n,i-1) - f(P_i) (g(\lfloor\frac{n}{P_i}\rfloor,i - 1) - g(P_i - 1,i - 1)) & P_i^2 \le n \end{cases} \]
    回頭來(lái),我們?cè)賮?lái)看最初我們提出的一些問(wèn)題。

    我們最開(kāi)始為什么要定義,對(duì)于一個(gè)合數(shù) \(p\)\(f(p) = p^k\) 呢?無(wú)非就是方便計(jì)算,方便利用完全積性函數(shù)的性質(zhì)。你發(fā)現(xiàn)到最后,合數(shù)的貢獻(xiàn)還是沒(méi)有算進(jìn)去,所以對(duì)于合數(shù)的定義是無(wú)所謂的。

    我們到底在哪里利用了 \(f(p)\) 是一個(gè)完全積性函數(shù)的性質(zhì)呢?這個(gè)性質(zhì)是在上式中第二種情況中利用到的。注意到我們?cè)跍p貢獻(xiàn)的時(shí)候,并沒(méi)有枚舉 \(P_i\) 的次數(shù),這也就意味著 \(g(\lfloor\frac{n}{P_i}\rfloor,i - 1)\) 中可能包含了某些數(shù)仍然是 \(P_i\) 的倍數(shù)。所以這一步需要有一個(gè)對(duì)于所有質(zhì)數(shù) \(p,f(p^2) = f^2(p)\) 的條件。由于之前我們假定了 \(f(p)\) 對(duì)于 \(p\) 為合數(shù)的情況也滿足 \(f(p) = p^k\) ,因此這個(gè)條件是得到滿足了的。

    遞歸實(shí)現(xiàn)很顯然。考慮一下非遞歸的實(shí)現(xiàn)。首先對(duì)于這個(gè)步驟,我們有用的 \(n\) 只有所有不同的 \(\lfloor\frac{n}{i}\rfloor,(1 \le i \le n)\),所以可以離散掉這些值,用一個(gè)大小為 \(2\sqrt{n}\) 的數(shù)組存下來(lái)。由于這個(gè)遞推是一層一層推的,所以實(shí)現(xiàn)上可以不用開(kāi)二維數(shù)組,可以直接離散之后用一個(gè)一維數(shù)組存下來(lái),需要注意枚舉順序。

    合數(shù)部分

    考慮我們?cè)谇筚|(zhì)數(shù)部分的時(shí)候,除了質(zhì)數(shù)的答案之和之外,還求出了些什么東西。事實(shí)上,對(duì)于所有的 \(\lfloor\frac{n}{i}\rfloor,(1 \le i \le n)\) ,我們求出了 \(g(\lfloor\frac{n}{i}\rfloor,|P|)\) 的值。

    我們?cè)O(shè) \(S(n,i)\) 表示 \(\le n\) 的所有數(shù) \(x\) 中,\(x\) 的最小質(zhì)因子 \(\ge P_i\)\(f(x)\) 之和。注意這里的 \(f(x)\)\(x\) 為合數(shù)的時(shí)候不再沿用質(zhì)數(shù)部分時(shí)的定義,也注意這里的定義與 \(g\) 的區(qū)別。

    接下來(lái)我們先算上所有滿足條件的質(zhì)數(shù)貢獻(xiàn)之和,即 \(\displaystyle g(n,|P|) - \sum_{j = 1}^{i - 1} f(P_j)\) 。對(duì)于合數(shù),我們直接枚舉其最小質(zhì)因子以及質(zhì)因子的個(gè)數(shù),直接遞歸計(jì)算。注意在這里形如 \(p^k,(p \in P)\) 的貢獻(xiàn)并沒(méi)有算進(jìn)去,所以還要單獨(dú)加一下。式子的形式如下:
    \[ S(n,i)=g(n,|P|)-\sum_{j=1}^{i-1}f(P_j)+\sum_{k\ge i}^{|P|}\sum_{e}(f(P_k^e)S(\lfloor\frac{n}{P_k^e}\rfloor,k+1)+f(P_{k}^{e+1})) \]
    直接對(duì)著式子看,應(yīng)該還是很好理解的。對(duì)這個(gè)式子,直接遞歸暴力計(jì)算即可,跑得會(huì)比第一部分快。

    至此 Min_25 篩的全過(guò)程就講完了。時(shí)間復(fù)雜度是 \(\displaystyle O(\frac{n^{\frac{3}{4}}}{\log n})\) 的,不大會(huì)證……

    例題

    首先可以用一個(gè)小問(wèn)題來(lái)感受 Min_25 篩的威力。

    SPOJ DIVCNT2

    題意


    \[ \sum_{i = 1}^{n} \sigma_0(i^2) \]
    其中 \(\sigma_0(i)\) 表示 \(i\) 的約數(shù)個(gè)數(shù)。

    \(n \le 10^{12},TimeLimit = 20s\)

    題解

    傳統(tǒng)的杜教篩做法需要考慮將式子拆為每個(gè)質(zhì)因子貢獻(xiàn)相乘,然后反演 + 杜教篩。如果我們有 Min_25 篩呢?

    我們發(fā)現(xiàn) \(f(x) = \sigma_0(x^2)\) 滿足 Min_25 篩的三個(gè)基本條件,\(f(p) = 3,f(p^k) = 2k + 1\) ,因此就是一道裸題了。

    我們發(fā)現(xiàn) SPOJ 還有兩道題叫 DIVCNT3 / DIVCNTK。于是此題三倍經(jīng)驗(yàn)……

    代碼

    #include<bits/stdc++.h> #define For(i,l,r) for(int i = (l),i##end = (r);i <= i##end;i++) #define Fordown(i,r,l) for(int i = (r),i##end = (l);i >= i##end;i--) #define debug(x) cout << #x << " = " << x << endlusing namespace std;typedef long long ll; typedef unsigned long long ull;template <typename T> inline bool chkmin(T &x,T y) { return y < x ? x = y,1 : 0; } template <typename T> inline bool chkmax(T &x,T y) { return x < y ? x = y,1 : 0; }const int INF = 0x3f3f3f3f; const int N = 2e6 + 10;int prime[N],vis[N],id1[N],id2[N]; ull B[N],Ans[N]; ll val[N],n; int pcnt = 0;inline ll read() {ll x = 0,flag = 1;char ch = getchar();while(!isdigit(ch) && ch != '-') ch = getchar();if(ch == '-') flag = -1,ch = getchar();while(isdigit(ch)) x = (x << 3) + (x << 1) + (ch - '0'),ch = getchar();return x * flag; }inline void init(int Lim) {For(i,2,Lim) {if(!vis[i]) prime[++pcnt] = i;for(int j = 1;j <= pcnt && i * prime[j] <= Lim;j++) {vis[i * prime[j]] = true;if(i % prime[j] == 0) break;}} }#define id(x) (x <= d ? id1[x] : id2[n / (x)])inline ull S(ll Lim,int cnt) {if(Lim <= 1 || prime[cnt] > Lim) return 0;int d = sqrt(n);ull ans = 3 * (B[id(Lim)] - (cnt - 1));for(int i = cnt;i <= pcnt && 1ll * prime[i] * prime[i] <= Lim;i++) {ll prod = prime[i];for(int times = 1;1ll * prod * prime[i] <= Lim;times++,prod = 1ll * prod * prime[i])ans += (2 * times + 1) * S(Lim / prod,i + 1) + (2 * times + 3);}return ans; }inline void Calc(ll Lim) {int d = sqrt(Lim),cnt = 0;for(ll i = 1;i <= Lim;i = Lim / (Lim / i) + 1) {val[++cnt] = Lim / i,id(val[cnt]) = cnt;B[cnt] = val[cnt] - 1;}for(int i = 1;i <= pcnt && 1ll * prime[i] * prime[i] <= Lim;i++)for(int j = 1;j <= cnt && 1ll * prime[i] * prime[i] <= val[j];j++)B[j] = B[j] - B[id(val[j] / prime[i])] + (i - 1); }int main() { #ifndef ONLINE_JUDGEfreopen("DIVCNT2.in","r",stdin);freopen("DIVCNT2.out","w",stdout); #endifint Case = read();init(2e6 + 5);while(Case--) {n = read();Calc(n);ull res = S(n,1) + 1;printf("%llu\n",res);}return 0; }

    Min_25 篩在一些質(zhì)因子相關(guān)的問(wèn)題上,也有很強(qiáng)的適用性,比如下面的這些題。

    UOJ188 Sanrd

    題意

    設(shè) \(f(x)\)\(x\) 的次大質(zhì)因子,重復(fù)質(zhì)因子算多個(gè)。求
    \[ \sum_{i = l} ^ {r} f(i) \]
    \(l,r \le 10^{11},TimeLimt = 5s\)

    題解

    這個(gè)函數(shù)顯然不是積性函數(shù)了,但是這個(gè)次大質(zhì)因子的形式,和 Min_25 篩枚舉最小質(zhì)因子的形式比較契合,因此可以想到在 Min_25 篩過(guò)程中統(tǒng)計(jì)答案。

    考慮我們?cè)谶f歸計(jì)算 \(S\) 的過(guò)程中,假設(shè)當(dāng)前遞歸到了 \(S(a,b)\) ,那么這些 \(\le a\)\(> P_b\) 的質(zhì)數(shù),在最開(kāi)始的時(shí)候,一定是 \(P_{b - 1}\) 的倍數(shù)(具體原因可以仔細(xì)看看 \(S\) 的遞歸計(jì)算的式子)。所以這些數(shù)的次大質(zhì)因子都是 \(P_{b - 1}\) 。因此就可以在 Min_25 篩過(guò)程中直接計(jì)算了。

    LOJ572 Misaka Network 與求和

    題意

    設(shè) \(f(x)\)\(x\) 的次大質(zhì)因子,重復(fù)質(zhì)因子算多個(gè)。求
    \[ \sum_{i = 1}^{n}\sum_{j = 1}^{n}f(\gcd(i,j))^k \bmod 2^{32} \]
    \(n,k \le 2 \times 10^9,TimeLimit = 4s\)

    題解

    前面經(jīng)典的反演比較簡(jiǎn)單,式子可以轉(zhuǎn)化為
    \[ \sum_{T = 1}^{n} (\lfloor\frac{n}{T}\rfloor)^2 \sum_{d | T} f(d)^k \mu(\frac{T}ozvdkddzhkzd) \]
    設(shè) \(F(x) = f(x)^k\) ,則所求即為
    \[ \sum_{T = 1}^{n} (\lfloor\frac{n}{T}\rfloor)^2 (F*\mu)(T) \]
    于是我們只要能夠快速求出 \(F * \mu\) 的前綴和,就可以整除分塊了。我們?cè)O(shè) \(\displaystyle S(n) = \sum_{i = 1}^{n} (F * \mu)(n)\),可以寫出一個(gè)杜教篩的式子。
    \[ g(1)S(n) = \sum_{i = 1}^n (F * \mu * g)(i) - \sum_{i = 2}^n g(i) S(\lfloor\frac{n}{i}\rfloor) \]
    由于 \(\mu * 1 = \epsilon\) ,容易想到令 \(g = 1\) 。那么 \((F * \mu * g)(i) = (F * (\mu * g))(i) = (F * \epsilon)(i) = F(i)\)
    \[ g(1)S(n) = \sum_{i = 1}^n F(i) - \sum_{i = 2}^n S(\lfloor\frac{n}{i}\rfloor) \]
    對(duì)于 \(F(i)\) 的前綴和,直接套用 Min_25 篩即可。

    轉(zhuǎn)載于:https://www.cnblogs.com/ShichengXiao/p/10186064.html

    總結(jié)

    以上是生活随笔為你收集整理的Min_25 筛小结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。