dirichlet 卷積, 數論分塊
杜教篩用於解決數論函式 \(f(n)\) 的字首和問題, 即求 :
\[s(n)=\sum_^f(i)
\] 對於任意數論函式 \(g(n)\) , 都有
\[\sum_^\sum_f(d)g\left(\frac\right)=\sum_^g(i)s\left(\left\lfloor\frac\right\rfloor\right)
\] 即
\[\sum_^(f*g)(i)=\sum_^g(i)s\left(\left\lfloor\frac\right\rfloor\right)
\] \(ps.\)
\((f*g)\) 表示函式 \(f(n)\) 與 \(g(n)\) 的 \(dirichlet\) 卷積.
證明:
\[\begin
\sum_^\sum_f(d)g\left(\frac\right)
&= \sum_^g(i)\sum_^\rfloor}f(j) \\
&= \sum_^g(i)s\left(\left\lfloor\frac\right\rfloor\right)
\end
\] 得證.
\[\begin
&\because\
\sum_^(f*g)(i)=\sum_^g(i)s\left(\left\lfloor\frac\right\rfloor\right)
=g(1)s(n)+\sum_^g(i)s\left(\left\lfloor\frac\right\rfloor\right). \\
&\therefore\
g(1)s(n)=\sum_^(f*g)(i)-\sum_^g(i)s\left(\left\lfloor\frac\right\rfloor\right).
\end
\] 後面那段可以用數論分塊解決, 如果能快速求得 \(\sum_^(f*g)(i)\) , 即函式 \((f*g)(n)\) 的字首和, 那麼我們就可以不斷遞迴地求出 \(s(n)\) , 並用 \(map\) 存下已經求得的值
在實際題目中, 我們會根據 \(f(n)\) 來確定 \(g(n)\) , 以快速地求出 \((f*g)(n)\) 的字首和. \(g(n)\) 的選取可以參照下表.
\[\begin
\varepsilon &= \mu *1 \\
id &= \varphi * 1 \\
\varphi &= \mu * id
\end
\] 關於這些函式的意義詳見 dirichlet卷積 莫比烏斯函式 莫比烏斯反演 學習筆記
學習筆記 杜教篩
這是一種通過建構函式 g x 來求一類積性函式字首和的做法,方法比較精妙 考慮我們要求函式 f 的字首和 s n sum n f i 已經有構造好的積性函式 g 將 f,g 做狄利克雷卷積,此時推式子可以得到 sum n f g k sum n sum f d g frac sum n g d su...
學習筆記 杜教篩
入門好部落格 杜教篩 pengym 求一些方便構造卷積形式的積性函式的字首和 不是積性函式如果可以變成卷積形式也可以做 構造h f g,然後推h的字首和,就可以把f字首和遞迴處理 所以,h,g字首和必須可以快速求 有時候,杜教篩的思想也值得借鑑。也是一些題目的解決方法。由於可以記憶化,所以在多次詢問...
杜教篩學習筆記
設有四個數論函式 bf h,f,g,s 滿足 mathbf h mathbf f mathbf g mathbf s n sum limits n mathbf f i sum limits n mathbf h i sum limits n sum limits mathbf g d mathbf...