学习笔记——狄利克雷 前/后缀和、前/后差分

发布时间 2023-08-13 06:42:06作者: Spade-A

定义

定义因数求和为

\[f(n)=\sum_{d|n}g(d) \]

这个式子可以反演得到

\[g(n)=\sum_{d|n}\mu(d)f(\frac nd) \]

这个式子可以理解为求因数差分,是因数求和的逆运算

再定义倍数求和为

\[f(n)=\sum_{n|d}g(d) \]

可得

\[g(n)=\sum_{n|d}\mu(\frac dn)f(d) \]

这个式子可以理解成求倍数差分,是倍数求和的逆运算

代码实现

狄利克雷 前缀和(因数求和)

for(int i=1;i<=num_p;++i)
    for(int j=1;j<=lim/pr[i];++j)
        w[j*pr[i]]+=w[j];

狄利克雷 后缀和(倍数求和)

for(int i=1;i<=num_p;++i)
    for(int j=lim/pr[i];j>=1;--j)
        w[j]+=w[j*pr[i]];

狄利克雷 前缀差分(因数差分)

for(int i=1;i<=num_p;++i)
    for(int j=lim/pr[i];j>=1;--j)
        w[j*pr[i]]-=w[j];

狄利克雷 后缀差分(倍数差分)

for(int i=1;i<=num_p;++i)
    for(int j=1;j<=lim/pr[i]++j)
        w[j]-=w[j*pr[i]];