以下主要的話都用無序列表表示。
有什麼好講的?
問乙個積性函式的字首和,項數到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年國家候選隊 中的任之洲的...