杜教篩用來解決積性函式求字首和的問題。
複雜度為\(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 = 1]
\]構造出所求函式\(\mu\)
\[1 = \sum_^ \sum_\mu(d) \\
\]設\(t=i/d\)
\[1 = \sum_^ \sum_^ \rfloor} \mu(d) \\
\]設\(m(\lfloor \frac \rfloor) = \sum\limits_^ \rfloor} \mu(d)\)$
\[1 = \sum_^ m(\lfloor \frac \rfloor) \\
m(n) = 1 - \sum_^ m(\lfloor \frac \rfloor)
\]對於\(i<10^7\),可以預處理出\(m(i)\)的值,存到陣列裡。
比較大的數可以通過數論分塊遞推求解。
模板題:51nod 1244 莫比烏斯函式之和
注意:\(code\)
#include#include#include#include#define mogeko qwq
using namespace std;
const int maxn = 1e7+5;
const int mod = 999979;
long long a,b;
int prime[5000005],mu[maxn],m[maxn];
int head[mod],nxt[1000005];
int cnt,tot;
pair num[1000005];
bool vis[maxn],flag;
void prime()
for(int j = 1; j <= tot && i*prime[j] <= 10000000; j++)
m[i] = m[i-1] + mu[i]; }}
void add(long long key,long long val)
long long query(long long key)
return 0;
}long long f(long long x)
ans = 1 - ans;
add(x,ans);
return ans;
}int main()
模板 杜教篩
杜教篩利用狄利克雷卷積來構造積性函式字首和之間的遞推式,從而利用記憶化搜尋在 n 的所有特殊點的字首和處求得 n 處的字首和。杜教篩用來處理積性函式求和問題,時間複雜度為 o n 具體證明如下 mu star 1 epsilon sum limits ni sum limits n sum limi...
習題 杜教篩(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 ...
杜教篩小結
目錄 bzoj3944 sum hihocoder 1456 rikka with lattice 這個演算法十分的強.一般就是用於卡一道數論推結論題最後的 20 30 分.被迫來學習qwq 這個一般用來篩乙個積性函式在 10 左右的字首和.為了了解一下,可以看看 2016年國家候選隊 中的任之洲的...