傳送門杜教篩的板子,拿來練手
\[\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...