Loading

[再谈/浅谈]积性函数求和

[再谈/浅谈]积性函数求和

为啥是再谈呢,因为我假装以前发过积性函数求和的blog,假装没有咕咕咕

Min_25筛

\(P\) 为素数集合,\(p_i\) 为素数集合中的第 \(i\) 个数,\(m_i\) 为一个数 \(i\) 的最小质因数

首先我们要求:

\[\sum\limits_{i=1}^n[i\in P]i^k \]

设:

\[g_{n,i}=\sum\limits_{j=1}^n[j\in P\or m_j>p_i]j^k \]

并且我们记前缀和 \(s_i\)

\[s_i=\sum\limits_{j=1}^ip_j^k \]

容易发现 \(g_{n,i}\) 就是 \([1,n]\) 中进行 \(i\) 轮埃氏筛后未被筛掉的数的 \(k\) 次方之和

显然,如果设 \(cnt\)\([1,\sqrt n]\) 内的质数个数,那么有:

\[\sum\limits_{i=1}^n[i\in P]i^k=g_{n,cnt} \]

现在我们要求的即为 \(g_{n,i}\) 的递推式,假设现在我们已经求出了 \(g_{n,i-1}\)

考虑这次被筛掉的数即为最小质因子等于 \(p_i\) 的数,其一定可以表示为 \(kp_i\)

于是我们提取 \(p_i\),转而枚举 \(k\)

\(g\) 函数的定义,我们还要加上之前的一些质数,因为它们不可能被筛掉

于是我们就可以很轻易的得出:

\[g_{n,i}=\begin{cases} g_{n,i-1}&&&&&p_i>\sqrt n \\ g_{n,i-1}-p_i^kg_{\lfloor\frac{n}{p_i}\rfloor,i-1}+p_i^ks_{i-1}&&&&&p_i\le\sqrt n \end{cases} \]

现在我们来考虑 \(f_i\)\(f\) 是一个积性函数,其中 \(\forall p_i\in P\)\(f_{p_i}\) 可以表示为多项式的形式,并且 \(f_{p_i^k}\) 可以快速计算

现在我们要求:

\[\sum\limits_{i=1}^nf_i \]

像上文一样,设:

\[s_{n,i}=\sum\limits_{j=1}^n[m_j> p_i]f_j \]

于是:

\[\sum\limits_{i=1}^nf_i=s_{n,0} \]

现在我们要计算 \(s_{n,i}\),我们将质数与合数对 \(s_{n,i}\) 的贡献分别进行计算,最后相加即可

首先根据上文,快速计算质数的贡献已经讨论完毕,即:

\[\sum\limits_{j=1}^n[j\in P]f_j-\sum\limits_{j=1}^{i-1}f_{p_j} \]

现在我们考虑合数的贡献,而这只需要枚举最小质因子及其出现次数即可,即:

\[\sum\limits_{j=i}^{p_j^2\le n}\sum\limits_{k=1}^{p_j^{k}\le n}\left( f_{p_j^k}(s_{\lfloor n/p_j^k\rfloor,j}+[k>1])\right) \]

综上,我们可以得出 \(s_{n,i}\) 的计算方式

\[s_{n,i}=\begin{cases} 0&&p_i>n \\ \sum\limits_{j=1}^n[j\in P]f_j-\sum\limits_{j=1}^{i-1}f_{p_j}+\sum\limits_{j=i}^{p_j^2\le n}\sum\limits_{k=1}^{p_j^{k}\le n}\left( f_{p_j^k}(s_{\lfloor n/p_j^k\rfloor,j}+[k>1])\right)&&p_i\le n \end{cases} \]

LG. 5493 质数前缀统计

洲阁筛与Min_25筛前置,但是可有可无,直接做也可以

首先对于自然数幂和,我们已经非常熟悉:

\[f(n)=\sum\limits_{i=1}^{k+2}(-1)^{k-i+2}\dfrac{y_i(n-1)^{\underline{k+2}}}{(i-1)!(k-i+2)!(n-i)} \]

这个东西可以 \(O(k)\) 计算,对于 \(n\) 较小的情况,计算相对麻烦一点,我们需要上下同除 \(n-i\)

然后我们来看本题,求:

\[\sum\limits_{i=1}^{\lfloor\sqrt n\rfloor}i^2S\left(\left\lfloor\dfrac n i\right\rfloor\right) \]

实际上,我们需要求的仅仅是 \(S\) 函数的值

根据上文,我们设一个函数 \(f\),满足 \(f_{n,i}\)\([1,n]\)\(m_j>p_i\) 的数的 \(k\) 次方和,\(m_j\) 的含义与上文的定义相同

换句话来说,\(f_{n,i}\) 就是 \([1,n]\) 中用埃氏筛筛 \(i\) 轮之后剩下的数的 \(k\) 次方和

而这,我们已于上文讨论过

于是我们维护一个 \(s\) 数组,\(s_i\) 维护 \(S(\lfloor\frac n i\rfloor)\) 的值,再维护一个 \(h\) 数组,\(h_i\) 维护 \(S(i)\) 的值

对于 \(\lfloor\frac{n}{p_i}\rfloor\),如果其大于 \(\sqrt n\),那么我们用 \(s\) 去更新它,否则,我们用 \(h\) 更新它

直接做就可以了

杜教筛

这东西比较基础,就放在min_25筛之后了,算是一个总结

狄利克雷卷积

给定函数 \(f,g\),定义两个函数的卷积乘法 \(*\) 为:

\[(f*g)(x)=\sum\limits_{d|n}f(d)g\left(\dfrac n d\right) \]

那么在狄利克雷卷积意义下,一个函数的逆为:

\[f^{-1}(n)=\dfrac 1 {f(1)}\left(\epsilon(n)-\sum\limits_{d|n\and d\ne 1}f(d)f^{-1}\left(\dfrac n d\right)\right) \]

证明,利用数学归纳法:

\[\begin{align*} (f*f^{-1})(x)&=\sum\limits_{d|n}f(d)f^{-1}\left(\dfrac n d\right) \\ &=f(1)f^{-1}(n)+\sum\limits_{d|n\and d\ne 1}f(d)f^{-1}\left(\dfrac n d\right) \\ &=\epsilon(n) \end{align*} \]

杜教筛

给定函数 \(f\),我们现在要求其前缀和,即:

\[s(n)=\sum\limits_{i=1}^nf(i) \]

朴素的算法是 \(O(n)\) 的,但是现在假设我们有一个积性函数 \(g\),我们去构造它的狄利克雷卷积:

\[\begin{align*} \sum\limits_{i=1}^n(f*g)(i)&=\sum\limits_{i=1}^n\sum\limits_{d|i}g(d)f\left(\dfrac i d\right) \\ &=\sum\limits_{d=1}^ng(d)\sum\limits_{i=1}^{\lfloor\frac n d\rfloor}f(i) \\ &=\sum\limits_{d=1}^ng(d)S\left(\left\lfloor\dfrac n d\right\rfloor\right) \\ &=g(1)S(n)+\sum\limits_{d=2}^ng(d)S\left(\left\lfloor\dfrac n d\right\rfloor\right) \end{align*} \]

因此,我们可以得到 \(S(n)\) 关于 \(S(\lfloor\frac n d\rfloor)\) 的一个递推式:

\[g(1)S(n)=\sum\limits_{i=1}^n(f*g)(i)-\sum\limits_{d=2}^ng(d)S\left(\left\lfloor\dfrac n d\right\rfloor\right) \]

复杂度使用积分近似,即:

\[\begin{align*} O\left(\sum\limits_{i=1}^\sqrt n\sqrt{\left\lfloor\dfrac n i\right\rfloor}\right)&=O\left(\int_{1}^\sqrt n\sqrt{\dfrac n x}\text dx\right) \\ &=O(n^{\frac 3 4}) \end{align*} \]

但是我们可以对较小的 \(n\) 进行预处理,这样一来,复杂度为

\[O\left(n^k+\sum\limits_{i=1}^{n^{1-k}}\sqrt{\left\lfloor\dfrac n i\right\rfloor}\right)=O(n^k+n^{1-\frac 1 2 k}) \]

\(k=\frac 2 3\) 即可,复杂度 \(O(n^\frac 2 3)\),个人认为多测用 map,单测直接记下取整的分母比较好

定义点乘 \((f·g)(x)=f(x)g(x)\)

如果 \(f\) 是完全积性函数,\(g,h\) 为数论函数,那么 \(((f·g)*(f·h))(x)=(f·(g*h))(x)\)

证明的话也比较简单:

\[((f·g)*(f·h))(x)=\sum\limits_{d|n}f(d)g(d)f\left(\dfrac n d\right)h\left(\dfrac n d\right)=f(n)\sum\limits_{d|n}g(d)h\left(\dfrac n d\right)=(f·(g*h))(x) \]

如果设 \(f,g\) 为两个数论函数,\(h\) 为一个完全积性函数,且满足 \(h(1)=1\),那么此时我们有:

\[f(n)=\sum\limits_{d=1}^nh(d)g\left(\left\lfloor\dfrac n d\right\rfloor\right)\Leftrightarrow g(n)=\sum\limits_{d=1}^n\mu(d)h(d)f\left(\left\lfloor\dfrac n d\right\rfloor\right) \]

证明也不难:

\[\begin{align*} \sum\limits_{d=1}^nh(d)g\left(\left\lfloor\dfrac n d\right\rfloor\right)&=\sum\limits_{d=1}^n h(d)\sum\limits_{k=1}^{\lfloor\frac n d\rfloor}\mu(k)h(k)f\left(\left\lfloor\dfrac n{kd}\right\rfloor\right) \\ &=\sum\limits_{i=1}^n\sum\limits_{k|i}h(i)\mu(k)f\left(\left\lfloor\dfrac n i\right\rfloor\right) \\ &=\sum\limits_{i=1}^nf\left(\left\lfloor\dfrac n i\right\rfloor\right)h(i)\epsilon(i) \\ &=f(n) \end{align*} \]

LG. 3768 简单的数学题

首先我们有一个广为人知的结论:

\[\sum\limits_{d|n}\varphi(d)=n \]

因此我们可以用 \(\gcd(x,y)\) 替换 \(n\) 获得另一个关于 \(\gcd\) 的等式

\[\begin{align*} \sum\limits_{i=1}^{n}\sum\limits_{j=1}^nij\gcd(i,j)&=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^nij\sum\limits_{d|i\and d|j}\varphi(d) \\& =\sum\limits_{d=1}^n\varphi(d)\sum\limits_{i=1}^{\lfloor\frac n d\rfloor}id\sum\limits_{j=1}^{\lfloor\frac n d\rfloor}jd \\ &=\sum\limits_{d=1}^nd^2\varphi(d)S\left(\left\lfloor\dfrac n d\right\rfloor\right)^2 \end{align*} \]

我们需要对 \(S\) 进行分块,因此我们就需要快速求出 \(d^2\varphi(d)\) 的前缀和

我们发现 \(d^2=\text{id}^2\),是一个完全积性函数,因此,根据之前的引理,我们只需要构造一个函数 \(h\),使得 \(\varphi *h\) 可以快速计算即可

显然 \(h\) 应该取常值函数,现在即构造 \(g=\text{id}^2*1=\text{id}^2=n^2\),我们即可得到 \(S(n)\)

\[S(n)=\sum\limits_{i=1}^ni^3-\sum\limits_{i=1}^Ni^2S\left(\left\lfloor\dfrac n i\right\rfloor\right) \]

嗯,然后就做完了

贝尔级数

对于积性函数 \(f(n)\),定义其在质数 \(p\) 意义下的贝尔级数为

\[F_p(x)=\sum\limits_{i=0}^\infty f(p^i)x^i \]

此时,一些常见的数论函数的贝尔级数为(默认除数函数 \(\sigma\)\(\sigma_0\)):

所以表格为什么没有办法正常渲染啊qwq

贝尔级数将狄利克雷卷积变成了一般卷积,即:

\[(f*g)_p(x)=f_p(x)g_p(x) \]

from rqy's blog

给定一个积性函数 \(f\),满足 \(f(p^k)=p^k+[k>0](-1)^k\),求 \(f\) 的前缀和

令左右两边同时加上 \(1\),现在 \(f(p^k)+1=\dfrac{1}{1-px}+\dfrac1{1+x}\)

因此如果我们取 \(g_p(x)=(1-px)(1+x)\),那么 \(h_p(x)=1+px^2\)

观察 \(h(n)\),发现当且仅当 \(h=p_1^2\cdots p_k^2\) 时,\(h(n)=\sqrt n\)

因此

\[\sum\limits_{i=1}^nh(i)=\sum\limits_{i=1}^{\lfloor\sqrt n\rfloor}i\mu^2(i) \]

现在我们来观察 \(g_p(x)\),这也是很好计算的,事实上,我们展开就能发现 \(g=(\text{id}·\mu)*\mu^2\)

而这也是非常好计算的,通过上文的引理,我们只需要令 \(g=\text{id}\)

此时

\[S(n)=\sum\limits_{i=1}^n\mu^2(i)-\sum\limits_{i=2}^niS\left(\left\lfloor\dfrac n i\right\rfloor\right) \]

现在我们发现两个前缀和中都是含有 \(\mu^2(i)\) 的,因此我们最后的任务变成了求

\[S(n)=\sum\limits_{i=1}^n\mu^2(i) \]

首先我们知道 \(\mu^2(n)\) 不为 \(0\) 的条件就是 \(n\) 不含平方因子,因此如果我们设 \(m_i\) 为其最大的平方因子,那么可以得到一个等式:

\[\mu^2(i)=[m_i=1] \]

所以我们用 \(\mu*\text{id}\) 来判定即可

又因为 \(d^2|i \Leftrightarrow d|m_i\),所以我们可以得到一个等式:

\[\mu^2(i)=\sum\limits_{d^2|i}\mu(d) \]

因此,我们可以在 \(O(\sqrt n)\) 的时间内计算其前缀和:

\[\sum\limits_{i=1}^n\mu^2(i)=\sum\limits_{i=1}^n\sum\limits_{d^2|i}\mu(d)=\sum\limits_{d=1}^\sqrt n\mu(d)\left\lfloor\dfrac n{d^2}\right\rfloor \]

Powerful Number

定义

如果一个数 \(n=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}\),且满足 \(a_1,a_2,\cdots,a_k\ge 2\),那么数 \(n\) 称作 \(\texttt{powerful number}\)

区间 \([1,n]\) 中,\(\texttt{powerful number}\) 只有 \(O(\sqrt n)\)

显然 \(\texttt{powerful number}\) 一定可以被表示成 \(a^2b^3\) 的形式,其中 \(a,b\) 不一定是质数

因此,我们利用积分进行近似,即可得出 \(\texttt{powerful number}\) 的个数:

\[\begin{align*} O\left(\sum\limits_{i=1}^\sqrt n\left(\dfrac n{i^2}\right)^{\frac1 3}\right)&=O\left(\int_{1}^\sqrt n\left(\dfrac n{i^2}\right)^{\frac1 3}\text di\right) \\ &=O\left(n^{\frac 1 3}\int_{1}^\sqrt ni^{-\frac2 3}\text di\right) \\ &=O\left(\sqrt n\right) \end{align*} \]

我们以Min_25筛的模板题为例来看看 \(\texttt{powerful number}\) 是如何应用的

本题对于一个质数 \(p\)\(f(p)=p(p-1)\),那么我们现在设一个数论函数 \(g(p)=p\varphi(p)\)

显然 \(f=g\),现在我们再设一个函数 \(h\),满足 \(h(1)=1\) 且在狄利克雷卷积意义下,\(f=g*h\)

根据上文提到的,我们知道 \(h\) 是唯一的一个积性函数

根据 \(p\) 是一个质数,此时我们有:

\[f(p)=g(1)h(p)+g(p)h(1) \]

根据此式,显然 \(h(p)=0\)

因此,当且仅当 \(n\) 是一个 \(\texttt{powerful number}\) 时,\(h(n)\) 才有可能不为零

现在我们考虑如何计算答案:

\[\begin{align*} \sum\limits_{i=1}^nf(i)&=\sum\limits_{i=1}^n\sum\limits_{d|i}g(d)h\left(\dfrac i d\right) \\ &=\sum\limits_{d=1}^ng(d)\sum\limits_{k=1}^{\lfloor\frac n d\rfloor}h(k) \end{align*} \]

现在我们要计算 \(h(p^k)\) 的值,根据条件,我们有:

\[f(p^k)=\sum\limits_{i=0}^kg(p^i)h(p^{k-i}) \]

将我们已知的东西带进去:

\[p^k(p^k-1)=\sum\limits_{i=0}^k(p-1)p^{2i-1}h(p^{k-i}) \]

因此:

\[h(p^k)=(k-1)(p^{k+1}-p^k) \]

利用杜教筛筛出 \(h\) 的值,暴力枚举质因子搜索出 \(\texttt{powerful number}\) 然后加进答案即可

posted @ 2021-06-11 17:53  zythonc  阅读(243)  评论(1编辑  收藏  举报