NeoMind

Liuguang_Ji的算法笔记

数论函数例题

积性函数专题

例题

2.1 因数倍数素数相关

LG P1414 又是毕业季II

给定一个 nn 元数组 aia_i, 问对正整数 kk11 取到 nn,从 aia_i 中选择 kk 个数的最大 gcdgcd 为多少 1n104,1ai1061 \leq n \leq 10^4, 1 \leq a_i \leq 10^6

  • 调和级数枚举

CF757 div2 D1/2. Divan and Kostomuksha(E/H)

给定一个 nn 元数组 aia_i,对数组进行重排,使得下面表达式值最大,输出最大值 i=1ngcd(a1,a2,,ai)\sum_{i = 1}^ngcd(a_1, a_2, \cdots, a_i)

1n105,1ai2×1071 \leq n \leq 10^5, 1 \leq a_i \leq 2 \times 10^7(Easy中 ai5×106a_i \leq 5 \times 10^6)

  • 很像 LG1414 的问题,首先我们先获取值域每个数字倍数的个数 bib_i
  • 那么假若全部都是 ii 倍数,一个基础值就是 ibii \cdot b_i
  • 但是 ii 倍数可能在前面一部分构成更大的一部分值,但注意到只有可能是 ii 的倍数,所以我们可以倒着遍历并枚举倍数,更新当前最大值,注意到最终答案就是 b1b_1
  • 不进行优化的复杂度基于调和级数 O(VlogV)O(VlogV)(VV 是值域),但这对于 Hard Version 是不可接受的,我们可以使用狄利克雷后缀和优化,计算 bib_i 是直接的,对于优化这个更新步骤我们可以使用类似的思想,只考虑素数倍数更新,最终复杂度 O(n+VloglogV)O(n + VloglogV)

2.2 积性函数

NC 华华给月月出题

给定 nn 计算下面的表达式

i=1n(inmod(109+7))\bigoplus_{i = 1}^n(i^n mod (10^9 + 7))

1n1.3×1071 \leq n \leq 1.3 \times 10^7

事实上这里 nn 的范围意味着直接进行枚举计算时间复杂度 O(nlogn)O(nlogn) 是不可接受的,这里我们可以使用线性筛 O(n)O(n) 预处理 1n1 - nnn 次方

CF391 div1 + 2 E. Bash Plays with Functions

牛客同题连接

按照下面的方式定义函数 fr(n)f_r(n)

  • r=0r = 0 时, f0(n)=pq=n[gcd(p,q)=1]f_0(n) = \sum_{pq = n}[gcd(p, q) = 1]

即满足 pq=npq = ngcd(p,q)=1gcd(p, q) = 1 的有序对 <p,q><p, q> 的对数

  • r1r \geq 1fr(n)=uv=nfr1(u)+fr1(v)2f_r(n) = \sum_{uv = n}\frac{f_{r-1}(u) + f_{r-1}(v)}{2}

qq 次查询,每次查询给定 r,nr, n 计算 fr(n)f_r(n) 的值 1q,n,r1061 \leq q, n, r \leq 10^6

我们需要挖掘出如下的一些性质

  1. f0(n)=2ω(n)f_0(n) = 2^{\omega(n)} 是一个积性函数,这可以从标准质因数分解式中看出
  2. fr(n)=dnfr1(d)f_r(n) = \sum_{d \mid n}f_{r-1}(d)frf_rfr1f_{r-1} 的狄利克雷前缀和或者是莫比乌斯变换结果,所以 frf_r 也是积性函数

于是我们在计算 fr(n)f_r(n) 的时候,可以考虑分解为若干质因数幂次的乘积,下面我们只需要研究素数幂处的取值 fr(pα)f_r(p^\alpha)

首先对于 f0(pα)f_0(p^\alpha),显然当 α=0\alpha = 0f0(1)=1f_0(1) = 1,当 α1\alpha \geq 1 时,f0(pα)=2f_0(p^\alpha) = 2 对于素数幂处的狄利克雷前缀和,取值显然和素数取值无关,考虑以指数 α\alpha 为下标,rr 阶函数即为 r1r - 1 阶前缀和,即有如下关系 fr(pα)=i=0αfr1(pi)f_r(p^\alpha) = \sum_{i = 0}^\alpha f_{r - 1}(p^i)

对于常数函数的 r(r>0)r(r > 0) 重前缀和,我们有组合数结论,则 fr(pα)=2(r+α1r)+(r+αr1)f_r(p^\alpha) = 2\binom{r + \alpha - 1}{r} + \binom{r + \alpha}{r - 1}

预处理 minp(n)minp(n) 和组合数,可以实现 O(n+r+qlogn)O(n + r + qlogn) 时间复杂度

P2158 [SDOI2008] 仪仗队

转化题意,也就是给定 nn,计算下面的表达式 i=0n1j=0n1[gcd(i,j)=1]\sum_{i = 0}^{n - 1}\sum_{j = 0}^{n - 1}[gcd(i, j) = 1]

1n4×1041 \leq n \leq 4 \times 10^4

2.3 莫比乌斯反演

LG P3455 [POI 2007] ZAP-Queries

SC同题链接 SC141

给出 a,b,da, b, d,求满足 1xa,1yb1 \leq x \leq a, 1 \leq y \leq b,且 gcd(x,y)=kgcd(x, y) = k 的二元组 (x,y)(x,y) 的数量 即求下面表达式的值

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

1T5×1041 \leq T \leq 5 \times 10^4 组测试,1n,m5×1041 \leq n, m \leq 5 \times 10^4

变形过程: i=1nj=1m[gcd(i,j)=k]=i=1nkj=1mk[gcd(i,j)=1]=i=1nkj=1mkdgcd(i,j)μ(d)=i=1nkj=1mkdndmμ(d)=d=1min(nk,mk)μ(d)i=1nk[di]j=1mk[dj]=d=1min(nk,mk)μ(d)nkdnkd=d=1min(nk,mk)μ(d)nkdmkd\begin{aligned} \sum_{i = 1}^n\sum_{j = 1}^m[gcd(i, j) = k] &= \sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor}\sum_{j = 1}^{\lfloor \frac{m}{k} \rfloor}[gcd(i, j) = 1] \ &= \sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor}\sum_{j = 1}^{\lfloor \frac{m}{k} \rfloor}\sum_{d \mid gcd(i, j)}\mu(d) \ &= \sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor}\sum_{j = 1}^{\lfloor \frac{m}{k} \rfloor}\sum_{d \mid n \text{且} d \mid m}\mu(d) \ &= \sum_{d = 1}^{min(\lfloor \frac{n}{k} \rfloor, \lfloor \frac{m}{k} \rfloor)}\mu(d)\sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor}[d \mid i]\sum_{j = 1}^{\lfloor \frac{m}{k} \rfloor}[d \mid j] \ &= \sum_{d = 1}^{min(\lfloor \frac{n}{k} \rfloor, \lfloor \frac{m}{k} \rfloor)}\mu(d)\lfloor \frac{\lfloor \frac{n}{k} \rfloor}{d} \rfloor \lfloor\frac{\lfloor \frac{n}{k} \rfloor}{d} \rfloor \ &= \sum_{d = 1}^{min(\lfloor \frac{n}{k} \rfloor, \lfloor \frac{m}{k} \rfloor)}\mu(d)\lfloor \frac{n}{kd} \rfloor \lfloor\frac{m}{kd} \rfloor \end{aligned}

  • (1) 是压缩区间的技巧
  • (2) 是莫比乌斯反演
  • (3) 是最大公因数的本质属性,消除掉 gcdgcd
  • (4) 是求和换序
  • (6) 是高斯函数的一个性质
  • 预处理莫比乌斯函数及其前缀和,可以利用整数分块在 O(V+Tmin(n,m))O(V + T\sqrt{min(n, m)}) 的时间内解决最终的求和式

LG P2522 [HAOI2011] Problem b

给定 a,b,c,d,ka, b, c, d, k 求下面表达式的值

i=abj=cd[gcd(i,j)=k]\sum_{i = a}^b\sum_{j = c}^d[gcd(i, j) = k]

1T5×1041 \leq T \leq 5 \times 10^4 组测试,1ab5×104,1cd5×1041 \leq a \leq b \leq 5 \times 10^4, 1 \leq c \leq d \leq 5 \times 10^4

  • 在上一题基础上做一个小容斥即可,设上一题中的求值函数是 f(x,y,k)f(x, y, k) ans=f(b,d,k)f(a,d,k)f(b,c,k)+f(a,c,k)ans = f(b, d, k) - f(a, d, k) - f(b, c, k) + f(a, c, k)

SC 公约数之和 145

给定 nn,求

i=1nj=i+1ngcd(i,j)\sum_{i=1}^n \sum_{j=i + 1}^n \gcd(i, j)

1T10001 \leq T \leq 1000 组测试样例,1n1061 \leq n \leq 10^6

我们首先解决下面两个弱化板的题目:

弱化版_2 LG P2398 GCD SUM 弱化板_1 P1390 公约数的和

他们只需要处理单测,nn 的范围略不同但不影响做法

首先这三个题目求的式子是同一回事,注意到以下变形技巧 i=1nj=1ngcd(i,j)=n(n+1)2+2i=1nj=i+1ngcd(i,j)\sum_{i = 1}^n \sum_{j = 1}^n \gcd(i, j) = \frac{n(n + 1)}{2} + 2\sum_{i=1}^n \sum_{j = i + 1}^n \gcd(i, j)

所以我们只研究 i=1nj=1ngcd(i,j)\sum_{i=1}^n \sum_{j=1}^n \gcd(i, j)

的求法,在不考虑莫比乌斯反演的情况下,弱化版有更简单的做法,可以做如下变形:

i=1nj=1ngcd(i,j)=d=1ndi=1nj=1n[gcd(i,j)=d]=d=1ndi=1ndj=1nd[gcd(i,j)=1]=d=1ndi=1nd(2j=1i[gcd(i,j)=1]1)=d=1ndi=1nd(2ϕ(i)1)\begin{aligned} \sum_{i = 1}^n \sum_{j = 1}^n gcd(i, j) &= \sum_{d = 1}^n d \sum_{i = 1}^n \sum_{j = 1}^n [gcd(i, j) = d] \ &= \sum_{d = 1}^n d \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j = 1}^{\lfloor \frac{n}{d} \rfloor}[gcd(i, j) = 1] \ &= \sum_{d = 1}^n d \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}(2\sum_{j = 1}^{i}[gcd(i, j) = 1] - 1) \ &= \sum_{d = 1}^n d \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}(2\phi(i) - 1) \end{aligned}

  • (7) 是一个常见的提取技巧,转换求和顺序先枚举公因数,这个变形在后面经常用到,你会注意到这样提取出了艾佛森括号,便可以使用莫比乌斯反演(后面会用到)
  • (8) 同(1)
  • (9) 利用对称性,使得可以使用欧拉函数定义
  • (10) 欧拉函数定义,注意到只有当两个界都是 nn 时才可以这样做,一般的给定上界 n,mn, m 也就不能有这个取巧的做法
  • 于是可以预处理欧拉函数前缀和,O(n)O(n) 的时间解决这个问题

题解还发现了一个调和级数枚举的方法,时间复杂度 O(nlogn)O(nlogn) 做法也挺神秘的

但是你会发现当我们需要多次查询时(结束这个弱化问题,回到原题),这个办法时间复杂度 O(Tn)O(Tn) 是不可接受的,这说明原式存在更快的做法

对于 (8) 式,我们可以使用莫比乌斯反演

d=1ndi=1ndj=1nd[gcd(i,j)=1]=d=1ndi=1ndj=1nddgcd(i,j)μ(d)=d=1ndd=1ndμ(d)ndd2=t=1nnt2dtdμ(nd)(t=dd)=t=1nϕ(t)nt2\begin{aligned} \sum_{d = 1}^n d \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j = 1}^{\lfloor \frac{n}{d} \rfloor}[gcd(i, j) = 1] &= \sum_{d = 1}^n d \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{d^{'} \mid gcd(i, j)}\mu(d^{'}) \ &= \sum_{d = 1}^n d \sum_{d^{'} = 1}^{\lfloor \frac{n}{d} \rfloor} \mu(d^{'}) \lfloor \frac{n}{dd^{'}} \rfloor^2 \ &= \sum_{t = 1}^n \lfloor \frac{n}{t} \rfloor^2 \sum_{d \mid t} d \mu(\frac{n}{d})(令 t = dd^{'}) \ &= \sum_{t = 1}^n \phi(t) \lfloor \frac{n}{t}\rfloor^2 \end{aligned}

  • (11)和(12) 本质就是(1)到(6)的变形,我们省略

  • (13) 是一个新技巧,我们合并两个变量再调换求和顺序,先枚举新变量再枚举一个旧变量,注意这里两个旧变量都是一样的,即(13)式等价于 t=1nnt2dtndμ(d)\sum_{t = 1}^n \lfloor \frac{n}{t}\rfloor^2 \sum_{d^{'} \mid t} \frac{n}{d^{'}} \mu(d^{'})

  • (14) 是关于欧拉函数的一个莫比乌斯反演公式,前面总结过

  • 于是对于 (14) 式,可以预处理欧拉函数前缀和,然后利用整除分块可以做到 O(n+Tn)O(n + T\sqrt n) 的时间复杂度

题解还有一种直接使用欧拉反演的推导,本质也就是在莫比乌斯反演的推论,不过需要的推导少一点

i=1nj=1ngcd(i,j)=i=1nj=1ndgcd(i,j)ϕ(d)=d=1nϕ(d)i=1n[di]j=1n[dj]=d=1nϕ(d)nd2\begin{aligned} \sum_{i = 1}^n \sum_{j = 1}^n gcd(i, j) &= \sum_{i = 1}^n \sum_{j = 1}^n \sum_{d | gcd(i, j)} \phi(d) \ &= \sum_{d = 1}^n \phi(d) \sum_{i = 1}^n [d \mid i] \sum_{j = 1}^n [d \mid j] \ &= \sum_{d = 1}^n \phi(d) \lfloor \frac{n}{d}\rfloor^2 \end{aligned}

总结一点,莫比乌斯反演的方式具有更广的用法,这里的两个上界替换成不同数字 n,mn, m 也是可做的

LG P2257 YY的GCD

给定 N,M,求 1xN1yM1 \leq x \leq N,1 \leq y \leq Mgcd(x,y)gcd(x,y) 为质数的 (x,y)(x,y) 有多少对

T104T \leq 10^4 组测试, 1N,M1071 \leq N, M \leq 10^7

首先容易发现这个题和前几个题的区别是将答案范围限制在了质数上,我们同样考虑做一些代数变形

i=1Nj=1M[gcd(i,j)Prime]=pPrimei=1Nj=1M[gcd(i,j)=p]=pPrimed=1min(np,mp)npdmpd=t=1min(n,m)ntmtptμ(tp)(t=pd)\begin{aligned} \sum_{i = 1}^N\sum_{j = 1}^M[gcd(i, j) \in Prime] &= \sum_{p \in Prime}\sum_{i = 1}^N\sum_{j = 1}^M[gcd(i, j) = p] \ &= \sum_{p \in Prime} \sum_{d = 1}^{min(\lfloor \frac{n}{p} \rfloor, \lfloor \frac{m}{p} \rfloor)} \lfloor \frac{n}{pd} \rfloor \lfloor \frac{m}{pd} \rfloor \ &= \sum_{t = 1}^{min(n, m)} \lfloor \frac{n}{t} \rfloor \lfloor \frac{m}{t} \rfloor \sum_{p \mid t} \mu(\frac{t}{p}) (令 t = pd) \end{aligned}

  • (19) 本质就是(1)到(6)的变形,我们省略
  • (20) 同(13)换元换序的技巧
  • 于是我们预处理这样一个东西:f(n)=pnμ(np)f(n) = \sum_{p|n}\mu(\frac{n}{p}),一种初始化时间复杂度 O(VlnlnV+T(M+N))O(VlnlnV + T(\sqrt{M} + \sqrt{N})),其中 V=107V = 10^7 为预处理部分(埃式筛初始化)
  • 事实上也可以线性筛初始化,这样初始化部分就是 O(V)O(V)

总结一个点

莫比乌斯反演的一个常见题目题型就为下面这个形式:

i=1nj=1mf(gcd(i,j))\sum_{i = 1}^{n}\sum_{j = 1}^{m}f(gcd(i, j))

我们可以一般化这个代数变形过程 i=1nj=1mf(gcd(i,j))=d=1min(n,m)i=1ndj=1mdf(d)[gcd(i,j)=1]=d=1min(n,m)f(d)i=1ndj=1mddgcd(i,j)μ(d)=d=1min(n,m)f(d)dgcd(i,j)μ(d)nddmdd=t=1min(n,m)ntmtdtμ(td)f(d)=t=1min(n,m)ntmtg(t)  (g=fμ)\begin{aligned} \sum_{i = 1}^{n}\sum_{j = 1}^{m}f(gcd(i, j)) &= \sum_{d = 1}^{min(n, m)}\sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j = 1}^{\lfloor \frac{m}{d} \rfloor} f(d)[gcd(i, j) = 1] \ &= \sum_{d = 1}^{min(n, m)}f(d) \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j = 1}^{\lfloor \frac{m}{d} \rfloor} \sum_{d^{'} \mid gcd(i, j)}\mu(d^{'}) \ &= \sum_{d = 1}^{min(n, m)}f(d) \sum_{d^{'} \mid gcd(i, j)}\mu(d^{'})\lfloor \frac{n}{dd^{'}} \rfloor \lfloor \frac{m}{dd^{'}} \rfloor \ &= \sum_{t = 1}^{min(n, m)} \lfloor \frac{n}{t} \rfloor \lfloor \frac{m}{t} \rfloor \sum_{d \mid t}\mu(\frac{t}{d}) f(d) \ &= \sum_{t = 1}^{min(n, m)} \lfloor \frac{n}{t} \rfloor \lfloor \frac{m}{t} \rfloor g(t);(g = f * \mu) \end{aligned}

  • 上述所有代数变形都是出现过的,当然这个式子局限性很大,要求右边函数是关于 gcdgcd 的单变量函数

LG P3768 简单的数学题

给定 n,pn, p,计算下面表达式的值 (i=1nj=1nijgcd(i,j))(modp)(\sum_{i = 1}^n\sum_{j = 1}^nijgcd(i, j))(mod:p)

1n1010,5×108p1.1×1091 \leq n \leq 10^{10}, 5 \times 10^8 \leq p \leq 1.1 \times 10^9

变形的要点我们之前都已经讲过 i=1nj=1nijgcd(i,j)=i=1nj=1nijdgcd(i,j)ϕ(d)=d=1nϕ(d)(i=1ni[id])2=d=1n14d2ϕ(d)(nd(1+nd))2\begin{aligned} \sum_{i = 1}^n\sum_{j = 1}^nijgcd(i, j) &= \sum_{i = 1}^n\sum_{j = 1}^nij\sum_{d \mid gcd(i, j)}\phi(d) \ &= \sum_{d = 1}^n\phi(d)(\sum_{i = 1}^ni[i \mid d])^2 \ &= \sum_{d = 1}^n\frac{1}{4}d^2\phi(d)(\lfloor \frac{n}{d} \rfloor(1 + \lfloor \frac{n}{d} \rfloor))^2 \end{aligned}

于是我们需要计算 i=lri2ϕ(i)\sum_{i = l}^ri^2\phi(i) 即需要 i2ϕ(i)i^2\phi(i) 的前缀和之后进行整除分块,这个前缀和需要进行杜教筛

LG P3312 [SDOI2014] 数表

TT 次询问,每次询问给定 n,m,an, m, a 计算下面表达式的值 i=1nj=1mσ(gcd(i,j))[σ(gcd(i,j))a]\sum_{i = 1}^n\sum_{j = 1}^m\sigma(gcd(i, j))[\sigma(gcd(i, j)) \leq a]

1T2×104,1n,m1051 \leq T \leq 2 \times 10^4, 1 \leq n, m \leq 10^5

代数变形的部分我们略写 i=1nj=1mσ(gcd(i,j))[σ(gcd(i,j))a]=d=1min(n,m)σ(d)[σ(d)a]i=1nj=1m[gcd(i,j)=d]=t=1min(n,m)ntmtdtσ(d)μ(td)[σ(d)a]\begin{aligned} &\sum_{i = 1}^n\sum_{j = 1}^m\sigma(gcd(i, j))[\sigma(gcd(i, j)) \leq a] \ &= \sum_{d = 1}^{min(n, m)}\sigma(d)[\sigma(d) \leq a]\sum_{i = 1}^n\sum_{j = 1}^m[gcd(i, j) = d] \ &= \sum_{t = 1}^{min(n, m)}\lfloor\frac{n}{t}\rfloor\lfloor\frac{m}{t}\rfloor\sum_{d \mid t}\sigma(d)\mu(\frac{t}{d})[\sigma(d)\leq a] \end{aligned}

我们注意到若没有 aa 的限制,这个问题在预处理 σμ(n)\sigma * \mu(n) 这个积性函数及其前缀和后每次查询进行数论分块基于可以,但是加上这个限制我们发现有的 dd 就不会考虑,怎么办呢?

我们这里需要结合到数据结构的思想,我们对查询进行离线,考虑对 aa 递增的维护 σμ(n)\sigma * \mu(n) 这个积性函数及其前缀和,每次更新需要对 dd 及其倍数下标累加上 σμ(d)\sigma * \mu(d) 这样的更新均摊下来就是讲调和级数的预处理分散到了各个查询。另外,由于需要动态维护前缀和,我们需要使用树状数组,最终的时间复杂度 O(qnlogn+nlog2n)O(q\sqrt{n}logn + nlog^2n)(认为 nnmm 同阶)

SPOJ LCMSUM

洛谷rj题面

给定 nn,计算下面的值 i=1nlcm(i,n)\sum_{i = 1}^n lcm(i, n)

1T3×1051 \leq T \leq 3 \times 10^5 组样例,1n1061 \leq n \leq 10^6

初见 lcmlcm,根据化归思想我们容易想到变形成关于 gcdgcd 的式子,不过接下来从莫反角度就有点无从下手,不过题解给出了一种神秘的变形做法,无需莫反(不知道有没有别的做法啊)

i=1nlcm(i,n)=i=1ningcd(i,n)=n+12(i=1n1ingcd(i,n)+(ni)ngcd(ni,n))=n+12i=1n1n2gcd(i,n)=12n+12n2i=1n1gcd(i,n)=12n+12n2dn1di=1n[gcd(i,n)=d]=12n+12n2dn1di=1nd[gcd(i,nd)=1]=12n+12n2dn1dϕ(nd)=12n(1+dndϕ(d))\begin{aligned} \sum_{i = 1}^n lcm(i, n) &= \sum_{i = 1}^n \frac{in}{gcd(i, n)} \ &= n + \frac{1}{2}(\sum_{i = 1}^{n - 1}\frac{in}{gcd(i, n)} + \frac{(n - i)n}{gcd(n - i, n)}) \ &= n + \frac{1}{2}\sum_{i = 1}^{n - 1}\frac{n^2}{gcd(i, n)} \ &= \frac{1}{2}n + \frac{1}{2}n^2\sum_{i = 1}^{n}\frac{1}{gcd(i, n)} \ &= \frac{1}{2}n + \frac{1}{2}n^2\sum_{d \mid n}\frac{1}{d}\sum_{i = 1}^{n}[gcd(i, n) = d] \ &= \frac{1}{2}n + \frac{1}{2}n^2\sum_{d \mid n}\frac{1}{d}\sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}[gcd(i, \frac{n}{d}) = 1] \ &= \frac{1}{2}n + \frac{1}{2}n^2\sum_{d \mid n}\frac{1}{d}\phi(\frac{n}{d}) \ &= \frac{1}{2}n(1 + \sum_{d \mid n}d\phi(d)) \end{aligned}

  • (21) 是二元 gcdgcdlcmlcm 的关系
  • (22) 是一个利用对称性的变形,这个变形本身算是常见但感觉不太容易想到
  • (23)(24) 是常规变形,值得注意的是 (24) 将求和上限恢复成 nn 是很有利于后面的变形的
  • (25)(26) 是求和换序,从而在 (27) 转化出欧拉函数定义
  • 于是可以预处理 f(n)=dndϕ(d)f(n) = \sum_{d \mid n}d\phi(d),在 O(nlogn+T)O(nlogn + T) 的时间解决问题
  • 补充的一点是不进行 (24) 的变形也是可以的,本质相同但要注意 dnd \neq n

LG P1829 [国家集训队] Crash的数字表格 / JZPTAB

给定 n,mn, m,计算下面的值

i=1nj=1mlcm(i,j)\sum_{i = 1}^n\sum_{j = 1}^m lcm(i, j)

1n,m1071 \leq n, m \leq 10^7

更加复杂一点的变形

i=1nj=1mlcm(i,j)=i=1nj=1mijgcd(i,j)=d=1min(n,m)1di=1nj=1mij[gcd(i,j)=d]=d=1min(n,m)di=1ndj=1mdij[gcd(i,j)=1]=d=1min(n,m)di=1ndj=1mdijdgcd(i,j)μ(d)=d=1min(n,m)dd=1min(nd,md)μ(d)i=1ndi[di]j=1mdj[dj]=d=1min(n,m)dd=1min(nd,md)d2μ(d)ndd(ndd+1)2mdd(mdd+1)2=t=1min(n,m)nt(nt+1)2mt(mt+1)2tdtdμ(d)(t=dd)\begin{aligned} \sum_{i = 1}^n\sum_{j = 1}^m lcm(i, j) &= \sum_{i = 1}^n\sum_{j = 1}^m\frac{ij}{gcd(i, j)} \ &= \sum_{d = 1}^{min(n, m)}\frac{1}{d}\sum_{i = 1}^n\sum_{j = 1}^m ij[gcd(i, j) = d] \ &= \sum_{d = 1}^{min(n, m)}d \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j = 1}^{\lfloor \frac{m}{d} \rfloor} ij[gcd(i, j) = 1] \ &= \sum_{d = 1}^{min(n, m)}d \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j = 1}^{\lfloor \frac{m}{d} \rfloor} ij\sum_{d' \mid gcd(i, j)}\mu(d') \ &= \sum_{d = 1}^{min(n, m)}d\sum_{d' = 1}^{min(\lfloor \frac{n}{d} \rfloor, \lfloor \frac{m}{d} \rfloor)} \mu(d')\sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}i[d' \mid i]\sum_{j = 1}^{\lfloor \frac{m}{d} \rfloor} j[d' \mid j] \ &= \sum_{d = 1}^{min(n, m)}d\sum_{d' = 1}^{min(\lfloor \frac{n}{d} \rfloor, \lfloor \frac{m}{d} \rfloor)}d'^2\mu(d') \frac{\lfloor \frac{n}{dd'} \rfloor(\lfloor \frac{n}{dd'} \rfloor + 1)}{2}\frac{\lfloor \frac{m}{dd'} \rfloor(\lfloor \frac{m}{dd'} \rfloor + 1)}{2} \ &= \sum_{t = 1}^{min(n, m)}\frac{\lfloor \frac{n}{t} \rfloor(\lfloor \frac{n}{t} \rfloor + 1)}{2}\frac{\lfloor \frac{m}{t} \rfloor(\lfloor \frac{m}{t} \rfloor + 1)}{2}t\sum_{d' \mid t} d'\mu(d')(令t = dd') \end{aligned}

  • (31) 需要注意 i,ji, j 除以 dd 后前面多乘上了 d2d^2
  • (34) 需要注意不要漏了 d2d'^2,这里存在一个等差数列求和式
  • 需要指出的是,这个变形是我自己给出的,预处理 f(t)=dtdμ(d)f(t) = \sum_{d' \mid t} d'\mu(d') 后 (35)式 数论分块可以做到 O(min(n,m))O(\sqrt{min(n, m)}) 的时间求值,但这个题没有多测,存在其他很多 O(min(n,m))O(min(n, m)) 的方法就已经足够了
  • 具体而言 O(min(n,m))O(min(n, m)) 的方法是只进行到 (34)式,令 h(n,m)=d=1min(n,m)d2μ(d)nd(nd+1)2md(md+1)2h(n, m) = \sum_{d' = 1}^{min(n, m)}d'^2\mu(d') \frac{\lfloor \frac{n}{d'} \rfloor(\lfloor \frac{n}{d'} \rfloor + 1)}{2}\frac{\lfloor \frac{m}{d'} \rfloor(\lfloor \frac{m}{d'} \rfloor + 1)}{2}

从而 ans=d=1min(n,m)dh(nd,md)ans = \sum_{d = 1}^{min(n, m)}dh(\lfloor \frac{n}{d} \rfloor, \lfloor \frac{m}{d} \rfloor)

在计算答案时,预处理 d2μ(d)d^2\mu(d) 的前缀和,单个 h(n,m)h(n, m) 的计算可以数论分块,计算 ansans 时数论分块,总计就是 O(min(n,m))O(min(n, m)) 的时间

  • 使用更加优秀的 (35)式计算时,则需要预处理 f(t)=dtdμ(d)f(t) = \sum_{d' \mid t} d'\mu(d') 显然能够 O(nlogn)O(nlogn) 调和级数的预处理,但是对于 10710^7 自然会超时,注意到这是一个积性函数,可以使用线性筛 O(n)O(n) 预处理,或者使用狄利克雷前缀和 O(nloglogn)O(nloglogn) 预处理
  • 关于为什么是积性函数,题解给出了一个巧妙的观点 tdtdμ(d)=dtd2μ(d)td=(t2μ(t))tt\sum_{d' \mid t} d'\mu(d') = \sum_{d' \mid t} d'^2\mu(d')\frac{t}{d'} = (t^2\mu(t)) * t,本质是(34)式到(35)式不化简,从狄利克雷卷积的角度这必然是积性函数

hdu4944 FSF’s game

给定 nn,计算下面的值

i=1nj=indi,jijgcd(id,jd)\sum_{i = 1}^n\sum_{j = i}^n\sum_{d \mid i, j} \frac{ij}{gcd(\frac{i}{d}, \frac{j}{d})}

1T5×1051 \leq T \leq 5 \times 10^5 组测试,1n5×1051 \leq n \leq 5 \times 10^5

这是一个更为综合的题目

我起初的推导

下面首先给出我之前给出的推导,由 gcdgcd 的性质我们知道

i=1nj=indi,jijgcd(id,jd)=i=1nj=indi,jijdgcd(i,j)\sum_{i = 1}^n\sum_{j = i}^n\sum_{d \mid i, j} \frac{ij}{gcd(\frac{i}{d}, \frac{j}{d})} = \sum_{i = 1}^n\sum_{j = i}^n\sum_{d \mid i, j} \frac{ijd}{gcd(i, j)}

而下标从 ii 开始是我们不喜欢的,可以做一个转化

i=1nj=indi,jijdgcd(i,j)=12(i=1nj=1ndi,jijdgcd(i,j)+i=1niσ(i))\sum_{i = 1}^n\sum_{j = i}^n\sum_{d \mid i, j} \frac{ijd}{gcd(i, j)} = \frac{1}{2}(\sum_{i = 1}^n\sum_{j = 1}^n\sum_{d \mid i, j} \frac{ijd}{gcd(i, j)} + \sum_{i = 1}^{n}i\sigma(i))

接下来我们就只考虑

i=1nj=1ndi,jijdgcd(i,j)\sum_{i = 1}^n\sum_{j = 1}^n\sum_{d \mid i, j} \frac{ijd}{gcd(i, j)}

进行类似前几题的变形

i=1nj=1ndi,jijdgcd(i,j)=k=1n1ki=1nj=1nij[gcd(i,j)=k]dkd=k=1nkσ(k)i=1nkj=1nkij[gcd(i,j)=1]=k=1nkσ(k)d=1nkμ(d)i=1nki[di]j=1nkj[dj]=k=1nkσ(k)d=1nkμ(d)d2(nkd(1+nkd)2)2=t=1n(nt(1+nt)2)2tdtdμ(d)σ(td)\begin{aligned} \sum_{i = 1}^n\sum_{j = 1}^n\sum_{d \mid i, j} \frac{ijd}{gcd(i, j)} &= \sum_{k = 1}^n\frac{1}{k}\sum_{i = 1}^n\sum_{j = 1}^nij[gcd(i, j) = k]\sum_{d \mid k}d \ &= \sum_{k = 1}^nk\sigma(k)\sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor}\sum_{j = 1}^{\lfloor \frac{n}{k} \rfloor}ij[gcd(i, j) = 1] \ &= \sum_{k = 1}^nk\sigma(k)\sum_{d = 1}^{\lfloor \frac{n}{k} \rfloor}\mu(d)\sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor}i[d \mid i]\sum_{j = 1}^{\lfloor \frac{n}{k} \rfloor}j[d \mid j] \ &= \sum_{k = 1}^nk\sigma(k)\sum_{d = 1}^{\lfloor \frac{n}{k} \rfloor}\mu(d)d^2 (\frac{\lfloor \frac{n}{kd} \rfloor (1 + {\lfloor \frac{n}{kd} \rfloor})}{2})^2 \ &= \sum_{t = 1}^n (\frac{\lfloor \frac{n}{t} \rfloor (1 + {\lfloor \frac{n}{t} \rfloor})}{2})^2t \sum_{d \mid t}d\mu(d)\sigma(\frac{t}{d}) \end{aligned}

  • (36) 是求和换序,枚举 gcdgcd,同时 dd 就会与 i,ji, j 独立
  • (37) 在转换 i,ji, j 的同时消除掉 dd
  • (38)(39)(40) 的变形同前
  • 于是我们预处理 nσ(n)n\sigma(n)dndμ(d)σ(nd)\sum_{d \mid n}d\mu(d)\sigma(\frac{n}{d}),可以在 O(nlogn+Tn)O(nlogn + T\sqrt n) 的时间内解决这个问题,但是你会发现这样 TT 了。hduhdu 的机子还是太慢了 3.5×1083.5 \times 10^8 竟然 4.5s4.5s 跑不过
博客思路

首先

i=1nj=indi,jijgcd(id,jd)=i=1nj=indi,jijdgcd(i,j)=i=1nj=indi,jdlcm(i,j)\begin{aligned} \sum_{i = 1}^n\sum_{j = i}^n\sum_{d \mid i, j} \frac{ij}{gcd(\frac{i}{d}, \frac{j}{d})} &= \sum_{i = 1}^n\sum_{j = i}^n\sum_{d \mid i, j} \frac{ijd}{gcd(i, j)} &= \sum_{i = 1}^n\sum_{j = i}^n\sum_{d \mid i, j} d:lcm(i, j) \end{aligned}

注意到转化为有关 lcmlcm 的式子,我们朝着前两个题的方向进行

i=1nj=indi,jdlcm(i,j)=d=1ndi=1nj=inlcm(i,j)[didj]=d=1nd2i=1ndj=indlcm(i,j)\begin{aligned} \sum_{i = 1}^n\sum_{j = i}^n\sum_{d \mid i, j} d:lcm(i, j) &= \sum_{d = 1}^nd\sum_{i = 1}^n\sum_{j = i}^nlcm(i, j)[d \mid i 且 d \mid j] \ &= \sum_{d = 1}^nd^2\sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j = i}^{\lfloor \frac{n}{d} \rfloor}lcm(i, j) \end{aligned}

我们定义 s(n)=i=1nj=1nlcm(i,j)s(n) = \sum_{i = 1}^n\sum_{j = 1}^nlcm(i, j) 这恰好是上一个题,在 n=mn = m 下的特殊情况

思路一

在上一个题中,我们给出了在 O(n)O(n) 预处理,O(n)O(\sqrt n)求单个 s(n)s(n) 的最快方法,但这样在外层同时进行数论分块的情况下时间复杂度是 O(Tn)O(Tn) 更加无法通过

思路二

注意这里是上一个题 n=mn = m 的特殊情况,在这种情况下有其他的方法,我们在上上个题中,计算 i=1nlcm(i,n)\sum_{i = 1}^n lcm(i, n)

存在 O(1)O(1) 的查询方法,我们注意到下面这一点 s(n)s(n1)=i=1nlcm(i,n)s(n) - s(n - 1) = \sum_{i = 1}^n lcm(i, n)

从而 s(n)s(n) 即可前缀和直接求出,于是在外层数论分块的情况下有 O(Tn)O(T\sqrt n) 的做法,也无法通过。

我们得到了同样复杂度的成果,但是接下来呢,我们期望实现 O(1)O(1) 的查询,那么也就是说答案数组 ansians_i 是可以预处理出来的,我们注意到 ansn=d=1nd2s(nd)ans_n = \sum_{d = 1}^nd^2s(\lfloor \frac{n}{d} \rfloor)

倘若我们枚举变量 dd,那么 id\lfloor \frac{i}{d} \rfloor 天然被分成 nd\lfloor \frac{n}{d} \rfloor 块,我们接着枚举每一个块做差分,最后做前缀和就可以在 O(nlogn)O(nlogn) 的时间内预处理好 ansians_i,从而可以实现 O(1)O(1) 查询。最终复杂度 O(nlogn+T)O(nlogn + T)

不知道的我的做法能不能继续优化

loj 2185「SDOI2015」约数个数和

洛谷同题链接LG P3327

给定 n,mn, m,计算下面的值

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

1T5×1041 \leq T \leq 5 \times 10^4 组测试,1n,m5×1041 \leq n, m \leq 5 \times 10^4

第一次遇到 d(ij)d(ij) 我们还是希望化归到 gcd(i,j)gcd(i, j) 的形式,所以我们给出如下的引理 d(ij)=xiyj[gcd(x,y)=1]d(ij) = \sum_{x \mid i}\sum_{y \mid j}[gcd(x, y) = 1]

可以使用构造双射或者直接在素因子分解式上考虑因数个数公式证明,于是我们可以做如下的变形 i=1nj=1md(ij)=i=1nj=1mxiyj[gcd(x,y)=1]=i=1nj=1mxiyjdgcd(x,y)μ(d)=i=1nj=1mdi,jμ(d)xidxyjdy=i=1nj=1mdi,jμ(d)d(id)d(jd)=di,jμ(d)i=1ndd(i)j=1mdd(j)\begin{aligned} \sum_{i = 1}^n\sum_{j = 1}^md(ij) &= \sum_{i = 1}^n\sum_{j = 1}^m\sum_{x \mid i}\sum_{y \mid j}[gcd(x, y) = 1] \ &= \sum_{i = 1}^n\sum_{j = 1}^m\sum_{x \mid i}\sum_{y \mid j}\sum_{d \mid gcd(x, y)}\mu(d) \ &= \sum_{i = 1}^n\sum_{j = 1}^m\sum_{d \mid i, j}\mu(d)\sum_{x \mid i 且 d \mid x}\sum_{y \mid j 且 d \mid y} \ &= \sum_{i = 1}^n\sum_{j = 1}^m\sum_{d \mid i, j}\mu(d)d(\lfloor \frac{i}{d} \rfloor)d(\lfloor \frac{j}{d} \rfloor) \ &= \sum_{d \mid i, j}\mu(d)\sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}d(i)\sum_{j = 1}^{\lfloor \frac{m}{d} \rfloor}d(j) \end{aligned}

  • (44) 到 (46) 是对 x,yx, y 关于 dd 换序,(47)是对 i,ji, j 关于 dd 换序
  • 于是由 (47) 式,预处理 d(n)d(n)μ(n)\mu(n) 及其前缀和,可以在 O(n+Tn)O(n + T\sqrt n) 的时间内解决

基于值域的反演一例

下面我们给两个在值域上进行莫比乌斯反演的例子

给定一个长为 nn 的数组 aia_i,计算下面的值 i=1nj=1n(gcd(ai,aj)+[gcd(ai,aj)1])\sum_{i = 1}^n\sum_{j = 1}^n(gcd(a_i, a_j) + [gcd(a_i, a_j) \neq 1])

既然出现了 gcdgcd 同样的我们先做如下变形

i=1nj=1n(gcd(ai,aj)+[gcd(ai,aj)1])=i=1nj=1ndgcd(ai,aj)ϕ(d)+n2i=1nj=1ndgcd(ai,aj)μ(d)=n2+i=1nj=1ndgcd(ai,aj)(ϕ(d)μ(d))=n2+d=1min{ai}(ϕ(d)μ(d))i=1n[dai]j=1n[daj]\begin{aligned} \sum_{i = 1}^n\sum_{j = 1}^n(gcd(a_i, a_j) + [gcd(a_i, a_j) \neq 1]) &= \sum_{i = 1}^n\sum_{j = 1}^n\sum_{d \mid gcd(a_i, a_j)}\phi(d) + n^2 - \sum_{i = 1}^n\sum_{j = 1}^n\sum_{d \mid gcd(a_i, a_j)}\mu(d) \ &= n^2 + \sum_{i = 1}^n\sum_{j = 1}^n\sum_{d \mid gcd(a_i, a_j)}(\phi(d) - \mu(d)) \ &= n^2 + \sum_{d = 1}^{min{a_i}}(\phi(d) - \mu(d))\sum_{i = 1}^n[d \mid a_i]\sum_{j = 1}^n[d \mid a_j] \end{aligned}

  • 其中 (48) 式是讲非互质转化为互质,是比较自然的想法

我们定义 cnt[x]=i=1n[xai]cnt[x] = \sum_{i = 1}^n[x \mid a_i] 即数组中满足值为 xx 的倍数的数字个数,那么我们要求的结果就是 n2+d=1min{ai}(ϕ(d)μ(d))cnt2(d)n^2 + \sum_{d = 1}^{min{a_i}}(\phi(d) - \mu(d))cnt^2(d)

所以我们预处理 cnt(i)cnt(i) (调和级数枚举)即可在 O(nlogn)O(nlogn) 的时间得到(或者狄利克雷后缀和优化 O(nloglogn)O(nloglogn)

NC练习赛104 炫酷反演魔术

给定一个长为 nn 的数组 aia_i,计算下面的值 i=1nj=1nϕ(ai,aj3)\sum_{i = 1}^n\sum_{j = 1}^n\phi(a_i, a_j^3)

1n,ai3×1051 \leq n, a_i \leq 3 \times 10^5

首先我们做变形

i=1nj=1nϕ(ai,aj3)=d=1max{ai}ϕ(d)i=1nj=1n[gcd(ai,aj3)=d]=d=1max{ai}ϕ(d)i=1nj=1n[daidaj3]dgcd(aid,aj3d)μ(d)=d=1max{ai}ϕ(d)d=1max{aid}μ(d)i=1n[ddai]j=1n[ddaj3]=t=1max{ai}(i=1n[tai])(j=1n[taj3])dtϕ(d)μ(td)(t=dd)\begin{aligned} \sum_{i = 1}^n\sum_{j = 1}^n\phi(a_i, a_j^3) &= \sum_{d = 1}^{max{a_i}}\phi(d)\sum_{i = 1}^n\sum_{j = 1}^n[gcd(a_i, a_j^3) = d] \ &= \sum_{d = 1}^{max{a_i}}\phi(d)\sum_{i = 1}^n\sum_{j = 1}^n[d \mid a_i 且 d \mid a_j^3]\sum_{d' \mid gcd(\frac{a_i}{d}, \frac{a_j^3}{d})}\mu(d') \ &= \sum_{d = 1}^{max{a_i}}\phi(d)\sum_{d' = 1}^{max{\lfloor\frac{a_i}{d}\rfloor}}\mu(d')\sum_{i = 1}^n[dd' \mid a_i]\sum_{j = 1}^n[dd' \mid a_j^3] \ &= \sum_{t = 1}^{max{a_i}}(\sum_{i = 1}^n[t \mid a_i])(\sum_{j = 1}^n[t \mid a_j^3])\sum_{d \mid t}\phi(d)\mu(\frac{t}{d})(令 t = dd') \end{aligned}

  • (51)(53) 是求和换序,(52) 是莫比乌斯反演,(54) 是前面多次见的换元

接下来我们类似的定义 cnt(n)=i=1n[nai]cnt(n) = \sum_{i = 1}^n[n \mid a_i],但接下来我们还有两个没见过的新东西

一个是 dtϕ(d)μ(td)\sum_{d \mid t}\phi(d)\mu(\frac{t}{d}),熟悉的人也许能一下反映到这就是 μϕ(n)\mu * \phi(n),即莫比乌斯函数和欧拉函数的狄利克雷卷积,这个目前只能线性筛预处理

另一个是 j=1n[taj3]\sum_{j = 1}^n[t \mid a_j^3],我们考虑将 tt 做一个变换 f(t)f(t),假设 t=i=1spiαit = \prod_{i = 1}^sp_i^{\alpha_i},令 f(t)=i=1spiαi3f(t) = \prod_{i = 1}^sp_i^{\lfloor\frac{\alpha_i}{3}\rfloor},于是 j=1n[taj3]=cnt(f(t))\sum_{j = 1}^n[t \mid a_j^3] = cnt(f(t)),这里实际操作时需要分解质因数,需要预处理 minp(i)minp(i)

综合上述过程,我们预处理 μϕ(i),cnt(i),f(i)\mu * \phi(i), cnt(i), f(i) 可以在 O(blogn)O(blogn) 的时间解决这个问题

Liuguang_Ji的算法笔记