模板 杜教篩

2022-04-07 22:47:42 字數 1454 閱讀 8943

杜教篩用來解決積性函式字首和的問題。

複雜度為\(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年國家候選隊 中的任之洲的...