二维积性函数——zky 数论选讲学习笔记
二维积性函数——zky 数论选讲学习笔记
线性筛
埃氏筛:从小到大扫,遇到一个质数就将其所有倍数标记为合数。可以证明时间复杂度是 \(O(n \log \log n)\) 的。
对于一个合数,考虑在其最小质因子 \(p\) 处筛掉他。设这个合数是 \(x × p\),先枚举 \(x\),然后再从小到大枚举 \(p\),并标记 \(xp\) 为合数。如果枚举的过程中发现 \(x \mod p = 0\),那么当 \(p\) 更大时 \(p\) 就不是 \(xp\) 的最小质因子了,终止循环。
每个合数只会被筛一次,所以时间复杂度 \(O(n)\)。该筛法还可以直接用于筛 \(f(i) = i^n\) 等积性函数。适用范围广,但复杂度也大。
数论函数和积性函数
定义:数论函数是定义域为正整数集,陪域为复数域的函数。
把它看成是一个只在整数处有值的函数就行了。
对于一个数论函数 \(f\),约定 \(S_{f(n)}=\sum_{i=1}^{n}f(i)\)
定义:积性函数是指一个定义域为正整数 \(n\) 的数论函数 \(f(n)\),且满足如下性质:\(f(1) = 1\),且当 \(a\) 和 \(b\) 互质时,\(f(ab) = f(a)f(b)\)
对于一个积性函数 \(f\),只要知道了对于所有 \(f(p^k)\)(\(p\) 是质数,\(k\) 是正整数),我们就可以知道整个 \(f\) 函数。
一般来说,我们说明一个数论函数是积性函数,只需要说明对于任意
\(x=∏_{i}p_i^{\alpha_i}\),都有 \(f(x)=∏_{i}f(p_i^{\alpha_i})\) 即可。
Dirichlet 卷积
对于数论函数 \(f\) 和 \(g\),定义其 \(Dirichlet\) 卷积:
如果将 \(Dirichlet\) 卷积视为数论函数的乘法,函数的直接加和为数论函数的加法。那么数论函数的加法和乘法是满足交换律、结合律和分配律的。
定理:对于积性函数 \(A\), \(B\),\(C = A ∗ B\) 也是积性函数。
也可以定义 \(Dirichlet\) 除法 \(A/B = C\) 使得 \(B ∗ C = A\)。只要
\(B(1)≠ 1\),就能逐位确定 \(C\)。此时 \(C\) 存在且唯一。
定理:如果 \(A\) 和 \(B\) 都是积性函数,那么 \(C\) 一定也是积性函数。
Dirichlet 前缀和
给定数组 \(a\),求数组 \(b\) 满足 \(b_x=\sum_{y|x}a_y\)。
我们可以将问题看成是,对于一个数论函数 \(A\),我们要求出 \(A ∗ I\) 的前 \(n\) 项。
因为 \(I\) 是一个积性函数,所以将其看成是积性函数的乘积。
设 \(f_i(p^k) = [p = pi]\)(\(p_i\) 是从小到大第 \(i\) 个质数)。那么 \(I =∏f_i\)。所以 \(A ∗ I = A ∗ f1 ∗ f2 ∗ ...\),即每次乘一个 \(f_i\)。注意到乘单个 \(f_i\) 是可以 \(O(\frac{n}{p_i})\) 完成的。所以总时间复杂度就变成了 $ O(n \log \log n)$。
普通数论函数卷普通积性函数也可以类似地做到 \(O(n \log \log n)\)。
该算法的“转置算法”求 \(b_x =∑_{x|y}a_y\) 也可以在相同复杂度内完成。
整除分块
计算 \(∑_{i=1}^{n} d(i)\)。
答案为 \(\sum_{i=1}^{n}=\sum_{xy=i}1=\sum_{xy≤n}1=\sum_{x=1}^{n}⌊\frac{n}{x}⌋\)
注意到 \(⌊\frac{n}{x}⌋\) 实际上只有 \(O(\sqrt n)\) 段,所以考虑一些基于此的暴力。
从 \(l = 1\) 开始。设 \(v = ⌊\frac{n}{k}⌋\)。每次找出满足 \(⌊\frac{n}{r}⌋ = v\) 的最大的 \(r\),然后 \([l, r]\) 这一段元素就可以被跳过,新的 \(l^′ = r + 1\) 继续做。
这个 \(r\) 就是满足 \(\frac{n}{r} ≥ v\) 的最大的 \(r\),即 \(⌊\frac{n}{v}⌋\)。所以这个问题容易 \(O(\sqrt n)\) 解决。
例题
给定序列 \(A, B, C\),求 \(∑_{i=1}^{n}∑_{j=1}^{n} A(i)B(j)C(gcd(i, j))\)。
\(n ≤ 10^6\)
传统做法是莫比乌斯反演,考虑使用积性函数性质解决。
设计函数 \(D\) 满足 \(C = D × I\),即 \(C_i=\sum_{j|i}^{D_j}\)。
那么答案等于 \(\sum_{i=1}^{n}A(i)\sum_{j=1}^{n}B(j)\sum_{d|i,d|j}D(d)\)
交换求和顺序,答案即为 \(\sum_{d}D(d)(\sum_{d|i}A(i))(\sum_{d|i}B(i))\)
Powerful Number
定义:称一个正整数 \(m\) 是 \(Powerful Number\),当且仅当对于任意 \(m\) 的质因数 \(p\),均有 \(p^2|m\)
定理:对于所有 $ PN$,我们都可以将其表示成 \(a^2b^3\) 的形式(其中 \(a\) 和 \(b\) 都是正整数)。
定理:\(n\) 以内的 \(PN\) 个数为 \(O(\sqrt n)\)
UOJ 885 红场阅兵
对于 \(70pts\) 部分分:给定一个积性函数 \(S\),求 \(\sum_{i=1}^{n}\sum_{j=1}^{n}S(ij)\),\(n≤3\times10^7\)
为了解决上面的问题,需要把积性函数推广到二维。
首先二维数论函数 \(g(x, y)\) 还是没什么性质的普通函数。
称二维数论函数 \(f(x, y)\) 是二维积性函数,当且仅当 \(∀a, b, c, d\) 使得 \(\gcd(ab, cd) = 1\),都有 \(f(ac, bd) = f(a, b)f(c, d)\)。
上面这个定义还是有点太抽象了(这是按照一维积性函数的定义改的)。实际上可以更简单地理解这件事情。假设 \(p_i\) 是从小到大第 \(i\) 个质数 \(x=∏_{i}p_i^{\a_i}\),\(y=∏_{i}p_i^{b_i}\),那么 \(f(x, y) = ∏_if(p_i^{a_i},p_i^{b_i})\)
容易发现,要求的是一个二维积性函数 \(f(x, y) = S(xy)\) 的二维前缀和
类似地,定义二维 \(Dirichlet\) 卷积。设 \(a, b\) 的 \(Dirichlet\) 卷积为 \(c\),那么:
类似一维地,\(c(1, 1)≠ 0\) 的数论函数存在逆元;两个二维积性函数的 \(Dirichlet\) 卷积和 \(Dirichlet\) 除法都是二维积性函数
类似 \(Powerful Number\) 地,考虑用 \(Powerful Number\) 的思想来解决问题。
考虑设计积性函数 \(g(x, y)\) 满足 \(g(p^a,p^b)=f(p^a,1) f(1,p^b)\)。对于这个函数,其前缀和 \(\sum_{i≤n_1}\sum_{j≤n_2}f(ij)\) 是相当容易计算的。
观察 \(h = f/g\)。对于单个 \(p\) 来说,发现这个 \(Dirichlet\) 除法相当于是二维多项式的除法。
发现 \(h(p^k, 1) = h(1, p^k) = 0\)
复杂度 \(O(n)\)
(时间复杂度的证明没看懂,所以留着吧,反正 \(O(n)\) 肯定能解决。)
P3327 [SDOI2015] 约数个数和
直接套用上文的做法,发现 \(h(x, y)\) 只在 \(x = y\) 处有值且值为 \(µ(x)\)。所以答案为 \(\sum_{i=1}^{n}µ(i)(\sum_{j=1}^{⌊n/i⌋}d(j))(\sum_{k=1}^{⌊m/i⌋}d(k))\),整除分块解决,复杂度 \(O(N + T \sqrt N)\)
P4619 [SDOI2018] 旧试题
把做法拓展到三维,可以得到 \(h(p^a,p^b,p^c)\) 只在 \({a, b, c}\) 形成的可重集是 \(\{0, 0, 0\}, \{0, 1, 1\}, \{1, 1, 1\}\) 处有值。直接搜有值位置的复杂度就是 \(O(n \sqrt n)\)。