积性函数&莫比乌斯反演&筛法学习笔记

积性函数&莫比乌斯反演&筛法

符号约定

\(\mathbb{P}\) 表示质数集合

在不加说明的情况下,\(p\) 为某个质数,\(p_i\) 表示从小到大第 \(i\) 个质数,且 \(p_0=1\)

\(\text{minp}(x)\) 表示 \(x\) 的最小质因子

理论基础

数论函数

定义在正整数域上的函数,值域在正整数域上的函数称为数论函数

狄利克雷卷积

对于两个数论函数 \(f,g\) 定义其狄利克雷卷积为 \((f*g)(n)=\sum_{d|n}f(d)g(\frac n d)\)

狄利克雷卷积有如下性质

  1. 交换律: \(f*g=g*f\)

  2. 结合律: \(f*(g*h)=(f*g)*h\)

  3. 分配律: \(f*(g+h)=f*g+f*h\)

  4. 有单位元 \(\epsilon\)

  5. \(f,g\) 均为积性函数,则 \(f*g\) 也为积性函数

证明下性质5

\[(f*g)(ij)=\sum_{d|ij}f(d)g(\frac {ij} d),i\perp j\\(f*g)(ij)=\sum_{d_1|i}\sum_{d_2|j}f(d_1d_2)g(\frac {ij}{d_1d_2})=\sum_{d_1|i}\sum_{d_2|j}f(d_1)f(d_2)g(\frac i {d_1})g(\frac j{d_2})\\=(\sum_{d_1|i}f(d_1)g(\frac i{d_1}))(\sum_{d_2|j}f(d_2)g(\frac j{d_2}))=(f*g)(i)(f*g)(j) \]

在狄利克雷卷积意义下存在逆的定义:

定义 \(g\)\(f\) 的逆,当且仅当 \(f*g=\epsilon\)

积性函数

若一个数论函数 \(f\) 满足 \(f(1)=1 \ \text{and} \ \forall \gcd(i,j)=1\to f(ij)=f(i)f(j)\) ,我们则称它是积性函数

特别的,对于满足 \(\forall i,j,f(i*j)=f(i)*f(j)\) 的数论函数 \(f\) ,我们称它是完全积性函数

常见的积性函数

元函数: \(\epsilon(n)=[n=1]\)

恒等函数: \(I(n)=1\)

单位函数: \(id(n)=n\)

幂函数: \(id_k(n)=n^k\)

约数个数函数:\(d(n)\)\(\sigma_0(n)\)

约数和函数:\(\sigma(n)\)

除数函数: \(\sigma_k(n)\)

欧拉函数: \(\varphi(n)\)

莫比乌斯函数: \(\mu(n)=\begin{cases}1,n=1\\(-1)^k,n为k个不同质数之积\\0,n有平方因子\end{cases}\)

积性函数的筛法

我们可以利用欧拉筛在线性时间内筛出任意积性函数 \(f\)

对于欧拉筛我们只需讨论两种情况

  1. \(i\perp p,p\space is \space prime,f(ip)=f(i)(p)\)
  2. \(i=p^kj,j\perp p,p\space is\space prime,f(ip)=f(j)f(p^{k+1})\)

对于不同的数论函数具体讨论即能求出

小结论

  1. \(\mu*I=\epsilon\)

    记n有k个不同素因子

    \((\mu*I)(n)=\sum_{d|n}\mu(d)=\sum_{i=0}^k(-1)^k\tbinom k i=(1-1)^k=[k=0]=[n=1]\)

  2. \(\varphi*I=id\)

    \(\sum_{d|n}\varphi(d)=n\)

    这个的证明考虑分母为n的n个真分数,约分后分子分母互质且每一个分母 \(d\) 出现次数为 \(\varphi(d)\)

    考虑每一个分母为 \(d\) 的,分子与 \(d\) 互质的 \(\varphi(d)\) 个分数大小不一且唯一

    同时乘上 \(\frac n d\) 后,分子一一对应\([1,n]\)

  3. \(\mu *id=\varphi\)

    考虑结论2与结论1

    \(\mu*id=\mu*\varphi*I=(\mu*I)*\varphi=\epsilon*\varphi=\varphi\)

莫比乌斯反演

根据我们已经学会的结论,我们能轻松得到莫比乌斯反演的公式了

\(f*I=g\iff g*\mu=f\)

由结论1可证

\(g(n)=\sum_{d|n}f(d)\iff f(n)=\sum_{d|n}\mu(d)g(\frac n d)\)

通过结论1,我们也有

\(\sum_{d|n}\mu(d)=[n=1]\)

经典式子推导

默认 \(n\leq m\)

复杂度记号 \(O(T_1)-O(T_2)\) 表示预处理 \(O(T_1)\) 单次询问 \(O(T_2)\)

  1. \(\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=1]\)

    套路莫反一波

    \(\sum_{i=1}^n\sum_{j=1}^m\sum_{d|\gcd(i,j)}\mu(d)\)

    考虑直接枚举 \(\gcd(i,j)\) 的因数 \(d\)

    \(\sum_{d=1}^{n}\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac m d}\mu(d)\\\sum_{d=1}^{n}\mu(d)\lfloor\frac n d\rfloor\lfloor\frac md \rfloor\)

    通过欧拉筛预处理 \(\mu\) 和整除分块可以做到 \(O(n)-O(\sqrt n)\)

  2. \(\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)\)

    套路枚举 \(\gcd\)

    \(\sum_{d=1}^{n}d\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac m d}[\gcd(i,j)=1]\)

    右边是我们熟悉的问题1,转化为

    \(\sum_{d=1}^{n}d\sum_{g=1}^{\frac n d}\mu(g)\lfloor\frac n{dg}\rfloor\lfloor\frac m {dg} \rfloor\)

    直接计算这个式子复杂度是 \(O(\sum_{d=1}^{n}\sqrt\frac n d)=O(n)\)

    考虑枚举 \(t=dg\) 交换一波和式

    \(\sum_{t=1}^{n}\lfloor\frac n t\rfloor\lfloor\frac m t\rfloor\sum_{d|t}d\mu(\frac t d)\)

    不难发现第二重和式就是 \((\mu*id)(t)=\varphi(t)\)

    简化为

    \(\sum_{t=1}^{n}\lfloor\frac n t\rfloor\lfloor\frac m t\rfloor\varphi(t)\)

    通过欧拉筛预处理 \(\varphi\) 和整除分块同样可以做到 \(O(n)-O(\sqrt n)\)

  3. \(\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1]ij\)

    类似问题1

    先套路莫反

    \(\sum_{i=1}^n\sum_{j=1}^m\sum_{d|\gcd(i,j)}\mu(d)ij=\sum_{d=1}^nd^2\mu(d)\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac m d}ij\\=\sum_{d=1}^nd^2\mu(d)\frac{(\lfloor\frac n d\rfloor+1)\lfloor\frac n d\rfloor(\lfloor\frac m d\rfloor+1)\lfloor\frac m d\rfloor}4\)

    预处理 \(id_2\mu\) ,整除分块可以做到 \(O(n)-O(\sqrt n)\)

  4. \(\sum_{i=1}^n\sum_{j=1}^m\text{lcm}(i,j)\)

    由于 \(\text{lcm}\) 并没有 \(\gcd\) 那么优美的性质,我们一般将其转化为 \(\gcd\) 计算

    \(\sum_{i=1}^n\sum_{j=1}^m\frac {ij}{\gcd(i,j)}\\=\sum_{d=1}^n\frac 1 d\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac m d}[\gcd(i,j)=1]idjd\\=\sum_{d=1}^nd\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac m d}[\gcd(i,j)=1]ij\)

    第二三重和式为问题3

    简化为

    \(\sum_{d=1}^nd\sum_{g=1}^{\frac n d}g^2\mu(g)\frac{(\lfloor\frac n {dg}\rfloor+1)\lfloor\frac n {dg}\rfloor(\lfloor\frac m {dg}\rfloor+1)\lfloor\frac m {dg}\rfloor}4\)

    由于这个部分式子不够优美,不能像问题2那样凑出一个优美的狄利克雷卷积

    我们直接整除分块套两次处理这个问题

    \(f(n,m)=\sum_{d=1}^nd^2\mu(d)\frac{(\lfloor\frac n d\rfloor+1)\lfloor\frac n d\rfloor(\lfloor\frac m d\rfloor+1)\lfloor\frac m d\rfloor}4\)

    \(ans=\sum_{d=1}^ndf(\lfloor\frac n d\rfloor,\lfloor\frac m d\rfloor)\)

    时间复杂度 \(O(??)\) 不太会算复杂度,如果记忆化后大概比线性略优

  5. \(d(ij)=\sum_{x|i}\sum_{y|i}[\gcd(x,y)=1]\)

    约数个数的经典转化

    这里放出Siyuan大佬的证明

  6. \(\sum_{i=1}^n\sum_{j=1}^md(ij)\)

    运用问题5的结论,交换和式得

    \(\sum_{d=1}^n\mu(d)\sum_{x=1}^{\frac n d}\sum_{y=1}^{\frac m d}\lfloor\frac n{xd}\rfloor\lfloor\frac m{yd}\rfloor\)

    可以做到 \(O(n)-O(\sqrt n)\)

贝尔级数

我们知道对于一个积性函数,在 \(p^k\) 处的点值决定了所有位置的点值,我们单独考察这些位置的点值。

对于一个积性函数 \(f\),称其贝尔级数 \(F_p(z)=\sum_{i=0}f(p^i)z^i\)。原本不太好描述的狄利克雷卷积被转化成了我们熟悉的幂级数卷积。

感觉这东西形式比狄利克雷生成函数更好一点。

下面罗列一些经典函数的贝尔级数:

\[\begin{align} \epsilon(z)&=1\\ I(z)&=\dfrac{1}{1-z}\\ id_k(z)&=\dfrac{1}{1-p^kz}\\ \mu(z)&=I^{-1}(z)=1-z\\ \varphi(z)&=\mu(z)id(z)=\dfrac{1-z}{1-pz}\\ d(z)&=I(z)I(z)=\dfrac{1}{(1-z)^2} \end{align} \]

我们回顾数论函数狄利克雷前缀和(即卷 \(I\))的高效 \(O(n\log\log n)\) 做法,稍加扩展可以得到数论函数 \(f\) 和一个贝尔级数为线性递推的积性函数 \(g\) 的狄利克雷卷积的新做法。

\(g(z)=\dfrac{A(z)}{B(z)}\),我们将卷积分成两步,即卷 \(A(z)\) 与卷 \(\dfrac{1}{B(z)}\),前者容易 \(O(|A|)\) 完成,后者是 \(|B|\) 阶线性递推,容易 \(O(|B|)\) 完成,故我们得到了一个 \(O(n\log\log n(|A|+|B|))\) 的做法。


进一步的,事实上对于数论函数 \(f\) 与积性函数 \(g\) 的狄利克雷卷积如果所有 \(g(p^k)\) 的点值可以快速求得(共 \(\dfrac{n}{\log n}\) 个点值,总复杂度不超过 \(O(n)\)),有通用的 \(O(n\log\log n)\) 做法。

考虑对于每个质数做一次狄利克雷卷积,即每次仅保留一个质数 \(p\) 的所有次幂的 \(g\) 的点值,容易分析复杂度为 \(O(\sum_p\sum_{k\geq 1}\dfrac{n}{p^k})=O(n\log\log n)\)

筛法

开始简单科技了

快速求得 \(\sum_{i=1}^nf(i)\)\(f\) 为某个数论函数

由于各种毒瘤出题人的存在,我们的式子可能已经难以更进一步了,达到了线性的优异复杂度

很多时候,式子的瓶颈均在线性筛上(毕竟这玩意是线性的),我们需要更优的方法筛出某个积性函数

更高深的奇怪筛法大多能在比线性略低的复杂度做到这一点

杜教筛

杜教筛的原理很简单,考虑一个性质优异的积性函数 \(g\)\(f\) 卷一起的前缀和

\(\sum_{i=1}^{n}(f*g)(i)=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac i d)=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac n d\rfloor}f(i)\)

我们敏锐的观察到后面的式子是 \(f\) 的前 \(\lfloor \frac n d\rfloor\) 项和

考虑把 \(d=1\) 的一项提出来,\(\sum_{i=1}^{n}(f*g)(i)=g(1)\sum_{i=1}^nf(i)+\sum_{d=2}^ng(d)\sum_{i=1}^{\lfloor\frac n d\rfloor}f(i)\)

\(\sum_{i=1}^nf(i)=\sum_{d=2}^ng(d)\sum_{i=1}^{\lfloor\frac n d\rfloor}f(i)-\sum_{i=1}^n(f*g)(i)\)

只要 \(g\) 的性质足够优越,使得 \(f*g,g\) 的前缀和均能快速求得且前面一项可通过整除分块降低复杂度

我们便成功的达到了我们的目的——降低复杂度

\((f*g)(n)\) 的前缀和计算复杂度为 \(T_0(n)\)\(\sum_{i=1}^nf(i)\) 的计算复杂度为 \(T_1(n)\)

由于我们共需运算 \(\sqrt n\)\(f\) 的前缀和,算上整除分块的复杂度与 \(\sqrt n\) 个取值,枚举取值 \(i\)

\(T_1(n)=\sum_{i=1}^{\sqrt n}O(\sqrt i)+O(\sqrt{\frac n i})=O(n^{\frac 3 4})\)

我们还能再优化一点,考虑线性筛筛出 \(f\)\(M\) 的取值

复杂度 \(T_1(n)=\sum_{i=1}^{\lfloor\frac n M\rfloor}O(\sqrt{\frac n i})=O(\frac n{\sqrt M})+O(M)\)

\(M=n^{\frac 2 3}\) 时复杂度最优

复杂度分析不懂.jpg

懂了!积分即可!

经典例子

  1. \(\sum_{i=1}^n\varphi(i)\)

    直接考虑 \(\varphi*1=id\)

    显然我们容易求 \(id,1\) 的前缀和

  2. \(\sum_{i=1}^n\mu(i)\)

    考虑 \(\mu*1=\epsilon\)

    \(1,\epsilon\) 的前缀和不要太弱智

  3. \(\sum_{i=1}^n\varphi(i)i^k\)

    考虑 \((\varphi\cdot id_k)*id_k=id_{k+1}\)

    \(((\varphi\cdot id_k)*id_k)(n)=\sum_{d|n}\varphi(d)d^k(\frac n d)^k=n^k\sum_{d|n}\varphi(d)=n^{k+1}\)

    \(id_k\) 的前缀和可以插值,或斯特林数,伯努利数等方法求出

Powerful Number 筛

Powerful Number

下文将称其为 PN

定义 PN 为一个质因数分解后,每个质因子指数不小于 2 的数

下面介绍一些 PN 的性质

  1. 任意一个 PN 可以表示成 \(a^2b^3\) 的形式

    考虑一种构造:对于指数为偶的质因子直接扔到 \(a\) 里,指数为奇的质因子放三个在 \(b^3\) 这边,其他往 \(a\)

  2. \([1,n]\) 的 PN 个数只有 \(O(\sqrt n)\)

    考虑统计 \([1,n]\) 内的 \(a^2b^3\) 形式的数的个数,这一定不比 PN 个数少

    枚举 \(a\),考虑 \(b\) 的取值:\(\int_1^{\sqrt n}\sqrt[3]{\dfrac{n}{x^2}}dx=O(\sqrt n)\)

如何得到 \(n\) 以内的 PN?

考虑筛出 \(\sqrt n\) 内的质数后直接搜索每个质因子的次数,显然不重不漏,复杂度 \(O(\sqrt n)\)

PN 筛

同样是解决积性函数的前缀和问题,PN 筛比杜教筛有更好的通用性

我们需要求得 \(S_f(n)=\sum_{i=1}^nf(i)\)

构造一个易求前缀和的积性函数 \(g\),要求满足 \(g(p)=f(p)\),称为素数拟合

构造积性函数 \(h\),满足 \(h=f/g\)

由于 \(f=g*h\),对于一个质数 \(p\)\(f(p)=g(p)+h(p)\),由于我们定义了 \(g(p)=f(p)\),那么 \(h(p)=0\)

由于 \(h\) 的积性,\(h(n)\) 有值仅当 \(n\) 为 PN

\[S_f(n)=\sum_{i=1}^nf(i)=\sum_{i=1}^n\sum_{d|i}h(d)g(\frac i d)\\=\sum_{d=1}^nh(d)\sum_{t=1}^{\lfloor n/d\rfloor}g(t)=\sum_{d=1}^n[d\in PN]h(d)S_g(\lfloor\frac n d\rfloor) \]

我们仅要求得所有 \(S_g(\lfloor\dfrac n i\rfloor)\),和有值的 \(h(i)\) 即可

计算 \(S_g(\lfloor\dfrac n i\rfloor)\) 可以考虑使用杜教筛,求得 \(h(i)\) 也并不难

考虑计算好 \(h(p^k),k>1\),搜索 PN 的过程中合并即可

而因为 \(f=g*h\)\(f(p^k)=\sum_{i=0}^kg(p^i)h(p^{k-i})\)

简单移项可以得到 \(h(p^k)=f(p^k)-\sum_{i=0}^{k-1}g(p^i)h(p^{k-i})\)

容易计算 \(h(p^k)\),计算所有 \(h(p^k)\) 不超过 \(O(\sqrt n)\)

容易发现 PN 筛的瓶颈主要在计算 \(S_g(\lfloor\dfrac n i\rfloor)\) 上,要么 \(S_g(n)\) 非常好求,要么 \(g\) 能使用杜教筛

Min_25筛

相比与杜教筛的使用条件,Min_25更为通用

Min_25筛能解决在 \(f(p)\) 处取值为关于p的低阶多项式且 \(f(p^c)\) 能快速求值的满足一定积性条件的函数前缀和问题

\(\sum_{i=1}^nf(i)\),设 \(m=\sqrt n内质数个数\)

预处理

这一部分也是洲阁筛的第一部分

我们试图求得 \(G_k(n)=\sum_{x=2}^n[x\in\mathbb{P}]x^k\)

考虑一个辅助 dp:\(F_k(i,n)=\sum_{x=2}^n[x\in \mathbb{P} \cup \operatorname{minp}(x)>p_i ]x^k\)

初值是 \(F(0,n)=\sum_{x=2}^nx^k\),考虑其转移:

\[F(i,n)=F(i-1,n)-p_i^k(F(i-1,\frac n{p_i})-G_k(p_{i-1})) \]

由于我们第二维仅需取 \(\forall i\in[1,n],\lfloor \frac n i\rfloor\)

对于一个固定的 \(n\),第一维仅有前 \(\frac{\sqrt n}{\log n}\) 种取值

那么复杂度 \(O(\sum_{i=1}^{\sqrt{n}}\dfrac{\sqrt{\frac n i}}{\log n})=O(\dfrac{n^{\frac 3 4}}{\log n})\)

求解

定义 \(S(i,n)=\sum_{x=2}^n[\operatorname{minp}(x)>p_i]f(x)\)

显然当 \(p_i\geq \sqrt n\)\(S(i,n)=0\)

\(S(i,n)=G(n)-G(p_i)+\sum_{j\geq i+1}\sum_{e\geq 1}f(p_j^e)(S(j,\dfrac{n}{p_j^e})+[e>1])\)

其中,\(G(n)\) 表示 \(\sum_{x=2}^n[x\in \mathbb{P}]f(p)\)

这一部分的复杂度是不大对的,但在忽略计算函数复杂度的情况下,该算法在 \(10^{11}\) 内表现优秀

函数拟合接近 \(O(\dfrac{n^{\frac 3 4}}{\log n})\)


发现 Min_25 求的 \(f\) 的前缀和所需满足的性质没有积性函数那么严格

仅需满足对于 \(x=\prod_{i=1}^mp_i^{a_i}\)\(f(x)=\prod_{i=1}^mf(p_i^{a_i})\)

甚至可以没有交换律:例如 \(f(x)\) 为一个矩阵

我们只需要满足 \(f(p)\) 的取值能用 \(p\) 的低阶多项式表示,\(f(p^c)\) 能快速求得,就能使用 Min_25 筛


卡常小技巧

[详细揭秘] min_25 筛的卡常技巧


【模板】Min_25筛

int S(int i,ll x){
    if(p[i]>=x)return 0;
    int k=(x<=m?ind1[x]:ind2[n/x]);
    int ans=sub(sub(f2[k]-f1[k])-sub(id2[i]-id[i]));
    for(int j=i+1;j<=len&&1ll*p[j]*p[j]<=x;j++){
        ll pr=p[j];
        for(int e=1;pr<=x;e++,pr=pr*p[j]){
            int v=pr%mod;
            ans=add(ans+1ll*v*(v-1)%mod*(S(j,x/pr)+(e!=1))%mod);
        }
    }
    return ans;
}
int main(){
    n=read();
    iv2=power(2,mod-2);iv3=power(3,mod-2);
    pre();
    for(ll l=1,r=0;l<=n;l=r+1){
        ll v=n/l;
        r=n/v;
        val[++tot]=v;
        if(v<=m)ind1[v]=tot;
        else ind2[n/v]=tot;
        v=v%mod;
        f1[tot]=1ll*v*(v+1)%mod*iv2%mod;f1[tot]--;
        f2[tot]=1ll*v*(v+1)%mod*(2ll*v%mod+1)%mod*iv2%mod*iv3%mod;f2[tot]--;
    }
    for(int i=1;i<=len;i++){
        for(int j=1;1ll*p[i]*p[i]<=val[j]&&j<=tot;j++){
            int k=(val[j]/p[i]<=m?ind1[val[j]/p[i]]:ind2[n/(val[j]/p[i])]);
            f1[j]=sub(f1[j]-1ll*sub(f1[k]-id[i-1])*p[i]%mod);
            f2[j]=sub(f2[j]-1ll*sub(f2[k]-id2[i-1])*p[i]%mod*p[i]%mod);
        }
    }
    printf("%d\n",add(S(0,n)+1));
    return 0;
}
posted @ 2021-08-23 16:15  juju527  阅读(161)  评论(1编辑  收藏  举报