帶著理解抄了一遍模板題解來加深印象
求解積性函式字首和一般可以使用杜教篩。但當這種積性函式不常見且難於捲出已於求字首和的函式時,杜教篩是乏力的。這時可以考慮使用min_25篩。
以下內容中約定 \(p\in\mathbb\) ,\(p_i\) 為第 \(i\) 大的質數。
使用min_25篩的條件:該函式(不妨令其為 \(f\) ) 是積性函式,且 \(f(p^k)\) 為關於 \(p\) 的低階多項式。
低次多項式的限制是因為min_25篩主要用來解決求 \(f(p)=p^k\) 的字首和,把多項式拆成若干單項式,分別求出字首和後相加就能得到答案。
min_25篩求解主要分兩個步驟。
我們按質數與合數將 \(\sum_^nf(i)\) 分類。
\[\sum_^nf(i)=\sum_f(p)+\sum_^nf(i)[i\notin\mathbb]
\]對後一部分列舉最小質因子來滿足限制。設 \(lpf_i\) 為 \(i\) 的最小質因子,
\[\sum_^nf(i)=\sum_f(p)+\sum_\sum_^\right\rfloor}f(i)[lpf_i\geq p]
\]於是對兩部分分別求解。
線性篩出所有 \(f(p)\) 肯定是不現實的。我們定義 \(g_\) 為 \(n\) 以內所有質數與最小質因子大於 \(p_i\) 的數的 \(k\) 次方和,我們要求的東西就是 \(g(x,\sqrt x)\),考慮dp求這個東西。
\(g(n,0)\) 可以 \(o(1)\) 求,考慮如何從 \(g(n,j-1)\) 轉移到 \(g(n,j)\) 。這步操作去掉的部分為最小質因子為 \(p_j\) 且不大於 \(n\) 的合數 \(k\) 次方值。
\[g(n,j)=g(n,j-1)-p_j^k(g(\left\lfloor\frac\right\rfloor,j-1)-g(p_,j-1))
\]後乙個 \(g\) 去掉了所有小於 \(p_j\) 的質數。
實際上我們需要的只是 \(g(x,p_y)\) ,其中 \(p_y\) 為最後乙個小於 \(x\) 的質數。稱它為 \(pw_x\) 。
繼續設 \(s_\) 為 \([1,n]\) 內最小質因子大於 \(p_x\) 的數函式值之和。繼續分類考慮轉移。第一部分是大於 \(p_x\) 的質數,可寫作 \(pw_n-pw_x\) 。另一部分是剩餘合數,可以遞迴求解。
\[s_=pw_n-pw_x+\sum_f(p_k^e)(s(\left\lfloor\frac\right\rfloor,k)+[e>1])
\]然後發現我們實際上只需要 \(\frac\) 處的 \(pw\) 值,因為合數的最小質因子不超過根號,所以 \(pw_x\) 都可以直接預處理出來。於是求解 \(g\) 時只需求 \(o(\sqrt n)\) 個值。
離散化時可以開兩個陣列,分別記錄 \(\frac\) 和 \(\frac}\) 離散化後的位置,存的時候哪個小就存哪個,可以保證陣列大小都是 \(o(\sqrt n)\) 的。
1的貢獻單算,最後加一。
\(code:\)
p5325[模板]min_25篩
#includeusing namespace std;
namespace io
while(ch>='0'&&ch<='9')
return f?-x:x;
} char outp[50];
void write(int x,char sp)while(x);
for(int i=len-1;~i;i--) putchar(outp[i]); putchar(sp);
}} using namespace io;
const int nn=300010,mod=1e9+7,inv3=333333336;
int n,sqr;
void pls(int& x,int y)
namespace min_25
for(int j=1;j<=cnt&&i*pri[j]<=n;j++)}}
void divblock()
}void getg()
}int calc(int x,int y,int res=0)
return res;
}} using namespace min_25;
signed main()
演算法 Min 25篩
本篇文章中使用的字母 p 指 text p in text 若函式 f x 滿足,f x 是積性函式 f p 可以使用多項式表示。已知 f p 要能在常數級的時間內計算 f p x x in n min 25篩可以在 theta frac 的時間複雜度內計算 f x 的字首和 或者說 theta n...
總結 篩法 Min 25篩
對於積性函式f x f x f x 求 i 1i n f i 其中n 1011 左右 sum f i 其中n leq 10 左右 i 1 i n f i 其 中n 1 011左 右 必須滿足的條件是 當p為質數時,f p f p f p 必須能表示為乙個多項式的形式,即f p a0 a1p a2p ...
Min 25 篩學習筆記
資料和 出處 資料2資料3 打死我也不承認參考了yyb的 min 25 篩可以幹嘛?下文中未特殊說明 p 均指質數集合,p i 或 p 指某個具體質數。求一類積性函式 f x 的字首和,需要滿足 f p 可以寫成多項式的形式,或者操作一下可以寫成多項式 如例題 且 f p k 能快速求出。講真學這個...