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

2022-07-07 02:12:10 字數 1604 閱讀 4777

傳送門杜教篩的板子,拿來練手

\[\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)*g(\frac)\\&=\sum_^\sum_f(\frac)g(d)\\&=\sum_^g(d)\sum_^\rfloor}f(i)\\&=\sum_^g(d)f(\lfloor\frac\rfloor)\\&=g(1)f(n)+\sum_^g(d)f(\lfloor\frac\rfloor)\end

\]\[f(n)=\frac^g(d)f(\lfloor\frac\rfloor)}

\]其中\(h(n)\)的時間複雜度為\(o(1)\),\(g(d)\)也為\(o(1)\),對\(\sum_^ng(d)f(\lfloor\frac\rfloor)\)數論分塊就好了

時間複雜度\(o(n^})\)

\[ans=\sum_^\mu(i)

\]\[設f(i)=\mu(i),g(i)=1,那麼顯然h(i)=(f*g)(i)=[i=1]\\設f(i)=\sum_^nf(i),h(i)=\sum_^h(i)

\]\[\beginh(i)&=\sum_^nh(i)\\&=\sum_^n\sum_f(\frac)g(d)\\&=\sum_^ng(d)f(\lfloor\frac\rfloor)\\&=g(1)f(n)+\sum_^ng(d)f(\lfloor\frac\rfloor)\end

\]\[f(n)=\frac^ng(d)f(\lfloor\frac\rfloor)}

\]一樣的,時間複雜度為$o(n^}) $

#include#include#include#include#includeusing namespace std;

int t;

int n;

int len;

int phi[2000005],mu[2000005];

int lenp,pri[2000005];

bool vis[2000005];

long long mphi[2000005];

long long mmu[2000005];

unordered_mapm1;

unordered_mapm2;

void prepa(int n)

for(int j=1;j<=lenp&&1ll*pri[j]*i<=n;j++)

mu[i*pri[j]]=mu[i]*mu[pri[j]];

phi[i*pri[j]]=phi[i]*phi[pri[j]];

}mmu[i]=mmu[i-1]+mu[i];

mphi[i]=mphi[i-1]+phi[i];

}}long long getphi(long long n)

return m1[n]=temp;

}long long getmu(int n)

return m2[n]=temp;

}void c_in()

模板 杜教篩

杜教篩用來解決積性函式求字首和的問題。複雜度為 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年國家候選隊 中的任之洲的...

模板 杜教篩

杜教篩利用狄利克雷卷積來構造積性函式字首和之間的遞推式,從而利用記憶化搜尋在 n 的所有特殊點的字首和處求得 n 處的字首和。杜教篩用來處理積性函式求和問題,時間複雜度為 o n 具體證明如下 mu star 1 epsilon sum limits ni sum limits n sum limi...