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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

min_25筛

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 min_25筛 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用途

f(x)f(x)f(x)是一個積性函數,min_25篩可以在O(n34log?n)O(\frac{n^{\frac{3}{4}}}{\log n})O(lognn43??)內求f(x)f(x)f(x)的前綴和:∑i=1Nf(i)\sum_{i=1}^{N}f(i)i=1N?f(i)

使用要求:f(p),f(pk)f(p),f(p^k)f(p),f(pk)的值可以快速求出(p∈Prime)(p\in Prime)(pPrime)

算法

Step 1:求∑i=1n[i∈Prime]f(i)\sum_{i=1}^{n}[i\in Prime]f(i)i=1n?[iPrime]f(i)

約定PPP表示質數集合,PiP_iPi?表示第iii個質數

首先我們要根據f(x)f(x)f(x)在質數處的點值的表達式構造出F(x)F(x)F(x)(有時需要把f(x)f(x)f(x)拆成多個F(x)F(x)F(x),滿足 F(x)F(x)F(x)是一個完全積性函數,并且F(x)F(x)F(x)的和可以迅速轉換成f(x)f(x)f(x)的和

然后設g(n,j)=∑i=1nF(i)[i∈Pori的最小質因數>Pj]g(n,j)=\sum_{i=1}^nF(i)[i\in P\ \ or \ \ i的最小質因數>P_j ]g(n,j)=i=1n?F(i)[iP??or??i>Pj?]

∑i=1n[i∈P]F(i)\sum_{i=1}^{n}[i\in P]F(i)i=1n?[iP]F(i)即為g(n,∣P∣)g(n,|P|)g(n,P)∣P∣|P|PPPP集合的大小)

考慮ggg的轉移:

  • Pj2>nP_j^2>nPj2?>n
    顯然不會產生新的貢獻了,此時有g(n,j)=g(n,j?1)g(n,j)=g(n,j?1)g(n,j)=g(n,j?1)

  • Pj2≤nP_j^2\leq nPj2?n
    g(n,j)=g(n,j?1)?∑[i的最小質因數=Pj]F(i)g(n,j)=g(n,j-1)-\sum[i的最小質因數=P_j]F(i)g(n,j)=g(n,j?1)?[i=Pj?]F(i)
    =g(n,j?1)?F(Pj)∑[i的最小質因數=Pj]F(iPj)=g(n,j-1)-F(P_j)\sum[i的最小質因數=P_j]F(\frac{i}{P_j})=g(n,j?1)?F(Pj?)[i=Pj?]F(Pj?i?)
    =g(n,j?1)?F(Pj)∑k=Pj?nPj?[k的最小質因數>Pj?1]F(k)=g(n,j-1)-F(P_j)\sum_{k=P_j}^{\lfloor\frac{n}{P_j}\rfloor}[k的最小質因數>P_{j-1}]F(k)=g(n,j?1)?F(Pj?)k=Pj??Pj?n???[k>Pj?1?]F(k)
    =g(n,j?1)?F(Pj)[g(?nPj?,j?1)?g(Pj?1,j?1)]=g(n,j-1)-F(P_j)[g(\lfloor\frac{n}{P_j}\rfloor,j-1)-g(P_j?1,j?1)]=g(n,j?1)?F(Pj?)[g(?Pj?n??,j?1)?g(Pj??1,j?1)]

  • 關于ggg的初值:

    考慮一下ggg的實際含義是什么呢?可以參考一下埃氏篩法的運行過程。

    假設現在有nnn個數依次排開,第iii個數是f(i)f(i)f(i),根據埃氏篩法的那套理論,每次選出一個質數ppp,然后篩掉所有f(k×p)f(k\times p)f(k×p)(k>=2)(k>=2)(k>=2)

    會發現g(n,j)g(n,j)g(n,j)就是運行jjj次埃氏篩法后,沒被篩掉的所有數之和。

    這里遞推的起點是g(n,0)g(n,0)g(n,0)g(n,0)g(n,0)g(n,0)的含義是把所有的數字當作質數,然后求∑i=1nF(i)\sum_{i=1}^nF(i)i=1n?F(i)

    最后,我們把F(x)F(x)F(x)轉回f(x)f(x)f(x)
    g(n,j)g(n,j)g(n,j)表示∑i=1nf(i)[i∈Pori的最小質因數>Pj]\sum_{i=1}^nf(i)[i\in P\ \ or \ \ i的最小質因數>P_j ]i=1n?f(i)[iP??or??i>Pj?]
    ∑i=1n[i∈P]f(i)\sum_{i=1}^{n}[i\in P]f(i)i=1n?[iP]f(i)即為g(n,∣P∣)g(n,|P|)g(n,P)

    編碼細節:

  • 轉移ggg只需用到N\sqrt NN?以內的質數,先線性篩預處理出這些質數
  • ggg只需要開第一維
  • 題目中的NNN往往很大,nnn直接枚舉的話會炸掉。所以要預處理一個集合S={?Nx?∣x∈[1,N]}S=\{\lfloor\frac{N}{x}\rfloor|x\in[1,N]\}S={?xN??x[1,N]},集合SSS的大小∣S∣=2N|S|=2\sqrt NS=2N?。遞推式中,?nPj?\lfloor\frac{n}{P_j}\rfloor?Pj?n??一定∈S\in SS,因為Pj≤NP_j\leq \sqrt NPj?N?,,而所有≤N\leq\sqrt NN?的數都可以通過?Nx?\lfloor\frac{N}{x}\rfloor?xN??得到,所以Pj?1∈SP_j-1\in SPj??1S。在具體實現時,先把SSS離散化一下,調用ggg的第一維時,直接枚舉離散化后SSS中各元素的編號。
  • Step 2:求最終答案

    S(n,j)=∑i=1nf(i)[i的最小質因數>=Pj]S(n,j)=\sum_{i=1}^{n}f(i)[i的最小質因數>=P_j]S(n,j)=i=1n?f(i)[i>=Pj?]

    最終答案即為S(n,1)+f(1)S(n,1)+f(1)S(n,1)+f(1)

    考慮SSS的轉移:

  • 算1~n中質數的貢獻:
    S(n,j)+=g(n,j)?∑i=1j?1f(Pi)S(n,j)+=g(n,j)?\sum_{i=1}^{j?1}f(P_i)S(n,j)+=g(n,j)?i=1j?1?f(Pi?)
    ∑i=1j?1f(Pi)=g(Pj?1,j?1)\sum_{i=1}^{j?1}f(P_i)=g(P_{j-1},j-1)i=1j?1?f(Pi?)=g(Pj?1?,j?1)

  • 算1~n中合數的貢獻:
    S(n,j)+=∑k=jPk2≤n∑e=1Pke+1≤nS(nPke,k+1)×f(Pke)+f(Pke+1)S(n,j)+=\sum_{k=j}^{P_k^2\leq n}\sum_{e=1}^{P_k^{e+1}\leq n}S(\frac{n}{P_k^e},k+1)\times f(P_k^e)+f(P_k^{e+1})S(n,j)+=k=jPk2?n?e=1Pke+1?n?S(Pke?n?,k+1)×f(Pke?)+f(Pke+1?)
    (枚舉合數的最小質因數及其最小質因數的指數)

  • 邊界條件:
    if(n<=1∣∣Pj>n)return0;if(n<=1||P_j>n)\ return\ 0;if(n<=1Pj?>n)?return?0;

    編碼細節:

  • 同上,ggg的第一維用離散化后SSS中各元素的編號表示
  • 參考博客:
    https://www.cnblogs.com/yoyoball/p/9185144.html
    https://blog.csdn.net/baiyifeifei/article/details/90454317
    https://www.cnblogs.com/zhoushuyu/p/9187319.html
    https://www.cnblogs.com/cjyyb/p/9185093.html

    總結

    以上是生活随笔為你收集整理的min_25筛的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。