杜教篩入門

2022-08-17 11:18:20 字數 2177 閱讀 6707

以下主要的話都用無序列表表示。

有什麼好講的?

問乙個積性函式的字首和,項數到1e10。

線性篩,積性函式。

欽定你已經可以再\(o(\sqrt)\)的複雜度內求出:

\[\sum_^n \rfloor}

\]\[\sum_^n \rfloor}

\]對於第乙個,先列舉小於\(\sqrt n\)的i,得出這段的值;又因為\(i\)在一段區間內\(\lfloor \frac \rfloor\)都是\(i_0\leq \sqrt n\),因此可以求前式和後式。

然後對於積性函式\(f(i)\),我們想求\(s_n=\sum_^n\)。

那麼,我們找乙個積性函式\(g\),令\(t_n=\sum_g(d)\times f(\frac)\)

(就是狄利克雷卷積)。則有:

\[\begin

\sum_^n & =\sum_^n \sum_)} \\

& =\sum_^n)}} \\

& =\sum_^n \rfloor}}

\end

\]然後,欽定\(g(1)=1\),那麼就有

\[\begin

s_n & =\sum_^n \rfloor}}-\sum_^n \rfloor}} \\

& =\sum_^n-\sum_^n \rfloor}}

\end

\]如果不管怎麼求\(s_ \rfloor}\)的話,發現滿足以下兩個條件就可以求\(s_n\)了。

考慮怎麼求上式後面的\(s_ \rfloor}\),由於f是積性函式,必定可以用線性篩篩出前n項,於是可以用線性篩篩了f求出\(s_\),至於大於\(\sqrt\)的下標,可以記搜:因為\(\lfloor \frac \rfloor} \rfloor=\lfloor \frac \rfloor\),於是可以記錄n/d的d,當\(d>\sqrt\)時直接返回結果就行。

對於\(\phi\),g為1(常值函式),t為i(自然數序列),用到的結論是\(x=\sum_\)。

證明有這樣幾個方向:

證明\(\forall i\mid n,1\leq j,都有\(i_1\times j_1\neq i_2\times j_2\)。顯然是要被叉翻的(其實是我在用3時不知道幹嘛了)。

直接通過\(\phi\)的計算公式和積性通過一波推理得到一些式子,化簡得到n。(巨佬做法)

證明\(\forall i\mid n,1\leq j,都有\(n/i_1\times j_1\neq n/i_2\times j_2\)。顯然,因為互質,所以兩個都是最簡分數,於是當i,j不同時,分數不可能相等,於是證明了任意乙個\(x\in [1,n]\)都只能由乙個(i,j)對轉移而來,即一一對應,證畢。

以上2的證明:

\[\begin

\sum_ & =\sum^m)} \\

& =\sum^m} \\

& =\prod_^m^} \\

& =\prod_^m^)}+1)} \\

& =\prod_^m}=n

\end

\]然後寫出來就可以了。

以下是乙份跑的非常慢的**模板(洛谷模板題的關鍵**)。

const int n = 3000005, nn = 3000000;

struct getsum

calced[d] = 1;

aftersum[d] = ans;

return ans;

}};int t, n;

int b[n];

ll phi[n], miu[n];

int temp[n / 10], top;

int main()

for (int j = 1; j <= top && i * temp[j] <= nn; ++j)

else}}

rep(i, 2, nn)

memcpy(van.presum, phi, 8 * (nn + 1));

memcpy(deep.presum, miu, 8 * (nn + 1));

while (t--), (int n) , (int n) ));

mem(deep.calced);

printf("%lld\n", deep.sum(n, 1, (int n) , (int n) , (int n) ));

}return 0;

}

習題 杜教篩(Sum)(杜教篩)

傳送門杜教篩的板子,拿來練手 beginans sum phi i end g n 1,phi n f n h n sum phi d g frac n h n sum f d g frac 令f n sum f i h n sum h i beginh n sum h i sum sum f d ...

模板 杜教篩

杜教篩用來解決積性函式求字首和的問題。複雜度為 o n frac 適用情況 已知函式 f 求 sum f 存在 f g f 且 g,sum g,f,sum f 容易求出。常用公式 mu i n 1 varphi i id 以求 sum mu 為例。mu i n 1 sum i 1 1 1 sum i...

杜教篩小結

目錄 bzoj3944 sum hihocoder 1456 rikka with lattice 這個演算法十分的強.一般就是用於卡一道數論推結論題最後的 20 30 分.被迫來學習qwq 這個一般用來篩乙個積性函式在 10 左右的字首和.為了了解一下,可以看看 2016年國家候選隊 中的任之洲的...