Min 25篩學習筆 口 記 糊

2022-06-06 12:15:14 字數 2860 閱讀 9571

說在前頭

為了方便描述,以下全部用\(p\)指代質數集合,用\(p_i\)指代第\(i\)個質數,\(minp(i)\)指代\(i\)的最小質因子

作用求一類積性函式\(f(x)\)的字首和,這樣的積性函式滿足:

時間複雜度為\(o(\frac})\)

思路大致分兩步進行:

第一步直接算\(f(i)\)可能十分難算,考慮到

\[f(p)=\sum_a_ip^i

\]於是我們先分別對所有的\(k\)求解\(\sum_^[i\in p]i^k\),最後再合併起來

設\[g(n,j)=\sum_^i^k[i\in p\ or \ minp(i)>p_j ]

\]也就是\([1,n]\)中所有滿足\(i\)是質數或者\(i\)的最小質因子大於\(p_j\)的\(i\)

考慮從\(g(n,j-1)\)轉移到\(g(n,j)\)

這個轉移過程中,我們會將\([1,n]\)範圍內最小質因子是\(p_j\)的合數的貢獻減去

如果\(p_j^2>n\),那麼\([1,n]\)範圍內沒有需要減去的貢獻,故

\[g(n,j)=g(n,j-1)

\]否則,考慮需要減去的合數的貢獻,假設其中任意乙個合數\(=i*p_j(minp(i)\ge p_j)\)

那麼需要減去的貢獻是\(p_j^ki^k\),於是

\[g(n,j)=g(n,j-1)-p_j^k\sum_^}[minp(i)\ge p_j]i^k

\]容斥一下,會發現

\[\sum_^}[minp(i)\ge p_j]i^k

\]就是\(g(\lfloor \frac\rfloor,j)\)去掉第\(1-(j-1)\)個質數的貢獻

綜上,我們有:

\[g(n,j)= \begin g(n,j-1)&p_j^2\gt n\\ g(n,j-1)-p_^k[g(\frac,j-1)-sum_]&p_j^2\le n \end

\]初始值:

\[g(n,0)=\sum_^i^k

\]其中\(sum_i=\sum_^p_i^k\),因為我們只需要\(\le \sqrt\)的質數,所以可以直接篩出這些質數以及\(sum\)

那麼我們所需要的答案就是\(g(n,tot)\),其中\(tot\)是質數的總數量

總結一下,我們所做的就是乙個類似埃氏篩的過程

我們先假設所有的數都是質數,按質數的方式計算出\(g(n,0)\),但是這其中所有合數的答案都是錯誤的

於是我們依次列舉所有質數,依次篩掉以當前質數作為最小質因子的合數的貢獻,直到\(g\)中只剩下了質數。

這個方法妙就妙在:雖然\(f(p),p\in prime\)是低階多項式,容易求解,但想要篩出所要的質數卻需要較高的複雜度,而\(\sum_^ i^k\)就相對來說好求的多了,並且篩的過程中我們只需要\(\le \sqrt\)的質數。

第二步我們開始求答案了,同樣考慮:

\[s(n,j)=\sum_^f(i)[minp(i)\ge p_j]

\]我們分開考慮質數的貢獻與合數的貢獻:

質數部分的貢獻顯然是:

\[g(n,tot)-\sum_^f(p_i)

\]注意這裡面的\(g\)是將所有的\(i^k\)加了起來得到的結果。

再考慮合數部分的貢獻,我們可以列舉這些合數的最小質因子\(p\)以及它的指數,然後利用\(f(x)\)是積性函式的性質轉移即可:

\[s(n,j)=g(n,tot)-\sum_^f(p_i)+\sum_\sum_t(f(p_k^t)s(\frac,k+1)+f(p_k^))

\]loj #6053 簡單的函式

題目中的\(f(x)\)滿足\(f(p^c)=p\oplus c,p\in p\)

於是有\(f(p)=p-1,p\in p,p \not= 2\),\(f(2)=3\)需要特判

於是就可以按上面的套路來計算,先將所有的數當成質數來計算

我們可以將質數的貢獻也拆分成質數和-質數個數(特判\(2\)),分別設為\(h\)和\(g\)

同時觀察到無論怎樣轉移,當前計算的\(s(i,j)\)中的\(i\)一定是某乙個\(\lfloor \frac nx \rfloor\),而這樣的數只有不超過\(2\sqrt\)個,於是我們只需要維護它們的\(g\)與\(h\)

於是初值為\(g(n)=\frac,h(n)=n-1\),然後依次篩即可

最後的\(s\),我們採用遞迴的方式,不需要記憶化,直接用之前的式子計算就行了

注意如果此時\(s(n,j)\)中\(j=1\),那麼需要額外加上\(f(2)\)少計算的2個貢獻,

#includeusing namespace std;

const int n=1e6+10;

const int mod=1e9+7;

typedef long long ll;

ll mx,p[n],pcnt;//h正在篩的質數個數,g正在篩的質數和

bool pd[n];

int sum[n],g[n],h[n];//sum是預處理的質數字首和

inline int add(int x,int y)

inline int dec(int x,int y)

inline void init() }}

ll n,w[n],id1[n],id2[n];//w是所有的n/i,tot是w的個數

int tot;

inline int s(ll x,int j)

} return ret;

} int main()//預處理

for(int j=1;j<=pcnt;++j)

}//第一步

int ans=s(n,1);//第二步

printf("%d\n",add(ans,1));//最後將1的貢獻加回來

return 0;

}

Min 25 篩學習筆記

資料和 出處 資料2資料3 打死我也不承認參考了yyb的 min 25 篩可以幹嘛?下文中未特殊說明 p 均指質數集合,p i 或 p 指某個具體質數。求一類積性函式 f x 的字首和,需要滿足 f p 可以寫成多項式的形式,或者操作一下可以寫成多項式 如例題 且 f p k 能快速求出。講真學這個...

Min 25 篩 學習筆記

埃氏篩法 整除分塊 這裡有提到 1.問題模型 2.min 25 篩 3.模板題以及模板 有乙個積性函式 f 對於所有質數 p f p 是關於 p 的多項式,f p k 非常容易計算 不一定是關於 p 的多項式 求 sum f i n leq 10 1s 設集合 p 表示素數集合。設 g sum f ...

Min 25篩 學習筆記

這兒只是乙個簡單說明 概括 總結。原理見這 min 25篩用來求積性函式字首和。範圍一般是 10 要求所求積性函式在 f i 已知時,f p times i p in primes,i times p in 1,n 能快速計算。首先計算 g n,j sum if i quad i是質數 或 i的最小...