2025 XYD Summer Camp 7.10 筛法
筛法
给定 n,mn,mn,m,求 ∀i∈[1,n],j∈[1,m]\forall i\in [1,n],j\in [1,m]∀i∈[1,n],j∈[1,m],i,ji,ji,j 互质的对数。
n,m≤1010n,m\le 10^{10}n,m≤1010。
最终只需计算 ∑d=1min(n,m)μ(d)⌊n/d⌋⌊m/d⌋\sum_{d=1}^{\min(n,m)}\mu(d)\lfloor n/d\rfloor\lfloor m/d\rfloor∑d=1min(n,m)μ(d)⌊n/d⌋⌊m/d⌋,瓶颈在于计算 μ\muμ 在若干个点上的前缀和,这些点一定属于 nnn 或 mmm 的整除点集合 Dn,DmD_n,D_mDn,Dm(就是使得 ⌊n/i⌋≠⌊n/(i+1)⌋\lfloor n/i\rfloor\ne \lfloor n/(i+1)\rfloor⌊n/i⌋=⌊n/(i+1)⌋ 的 iii)。我们希望能在 O(n)O(n)O(n) 以下的时间复杂度求出 ∀i∈Dn∪Dm,∑j=1iμ(j)\forall i\in D_n\cup D_m,\sum_{j=1}^i \mu(j)∀i∈Dn∪Dm,∑j=1iμ(j)。
- 筛法:筛出质数,或者求一些积性函数的点值 / 前缀和。
杜教筛
这是一个关于 GGG 的一个递推式,后面一个求和式可以使用整除分块,于是求解 G(n)G(n)G(n) 我们需要求解 nnn 的所有整除点上的 GGG,恰好符合问题所求;而递归下去又要求解所有整除点的整除点的……的整除点上的 GGG,根据整除性质可得这些点的 GGG 也是我们需要求解的 nnn 的某些整除点的 GGG。
- 整除性质:⌊⌊ni⌋j⌋=⌊nij⌋\left\lfloor\cfrac{\left\lfloor\frac{n}{i}\right\rfloor}{j}\right\rfloor=\left\lfloor\cfrac{n}{ij}\right\rfloor⌊j⌊in⌋⌋=⌊ijn⌋,我的整除的整除还是我的整除。
现在问题变成快速求 f,hf,hf,h 的前缀和。注意到 1∗φ=id1*\varphi=\mathrm{id}1∗φ=id,1∗μ=ϵ1*\mu=\epsilon1∗μ=ϵ,且 1,id,ϵ1,\mathrm{id},\epsilon1,id,ϵ 前缀和很好求,于是就可以快速求 φ,μ\varphi,\muφ,μ 在 nnn 整除点上的前缀和。
直接使用杜教筛的时间复杂度是 O(n3/4)O(n^{3/4})O(n3/4) 的,考虑使用线性筛算出所有 i∈[1,n2/3]i\in [1,n^{2/3}]i∈[1,n2/3] 的 G(i)G(i)G(i) 的值,这样时间复杂度就平衡成 O(n2/3)O(n^{2/3})O(n2/3),即算出所有 nnn 的整除点处 ggg 的前缀和的时间复杂度。
给定 n,mn,mn,m,求 ∀i∈[1,n],j∈[1,m]\forall i\in [1,n],j\in [1,m]∀i∈[1,n],j∈[1,m],i,ji,ji,j 互质的对数。
n,m≤1010n,m\le 10^{10}n,m≤1010。
直接使用杜教筛算出 n,mn,mn,m 所有整除点处的 μ\muμ 的前缀和即可。
给定 n,k,l,rn,k,l,rn,k,l,r,求从 [l,r][l,r][l,r] 中选 nnn 个整数使得选出的数的 gcd\gcdgcd 恰好为 kkk 的方案数。
n,k≤109n,k\le 10^9n,k≤109,1≤l≤r≤1091\le l\le r\le 10^91≤l≤r≤109,有 T≤10T\le 10T≤10 组数据。
设 f(k)f(k)f(k) 表示这个问题的答案, 另设 g(k)g(k)g(k) 表示选出的数是 gcd\gcdgcd 的倍数的方案数,显然此时只要求选出的数是 kkk 的倍数,于是有 g(k)=(⌊r/k⌋−⌊(l−1)/k⌋)ng(k)=(\lfloor r/k\rfloor-\lfloor (l-1)/k\rfloor)^ng(k)=(⌊r/k⌋−⌊(l−1)/k⌋)n。根据两个函数的定义有 g(k)=∑k∣if(i)g(k)=\sum_{k|i} f(i)g(k)=∑k∣if(i),莫比乌斯反演可得
f(k)=∑k∣iμ(k/i)g(i)=∑i∈N∗μ(i)g(ik)=∑i∈N∗μ(i)(⌊⌊r/k⌋i⌋−⌊⌊(l−1)/k⌋i⌋)
\begin{aligned}f(k)&=\sum_{k|i}\mu(k/i)g(i)\\&=\sum_{i\in\N^*}\mu(i)g(ik)\\&=\sum_{i\in \N^*}\mu(i)\left(\left\lfloor\frac{\lfloor r/k\rfloor}{i}\right\rfloor-\left\lfloor\frac{\lfloor (l-1)/k\rfloor}{i}\right\rfloor\right)\end{aligned}
f(k)=k∣i∑μ(k/i)g(i)=i∈N∗∑μ(i)g(ik)=i∈N∗∑μ(i)(⌊i⌊r/k⌋⌋−⌊i⌊(l−1)/k⌋⌋)
整除分块即可。注意到两个整除只要有一项非 000 就有贡献,因此枚举时应枚举到 rrr 而不是 l−1l-1l−1。
给定 n,m,kn,m,kn,m,k,求 ∀x∈[1,n],y∈[1,m]\forall x\in[1,n],y\in[1,m]∀x∈[1,n],y∈[1,m] 满足 xy\cfrac{x}{y}yx 在 kkk 进制下表示成小数形式后,小数部分可以表示成 c1c2c3⋯cpc1c2⋯‾\overline{c_1c_2c_3\cdots c_pc_1c_2\cdots}c1c2c3⋯cpc1c2⋯ 的无限循环形式的 (x,y)(x,y)(x,y) 对数。分数值相同只算一次。
1≤n,m≤1091\le n,m\le 10^91≤n,m≤109,2≤k≤2×1032\le k\le 2\times 10^32≤k≤2×103。
假设 k=10k=10k=10,那么对于分数 xy\cfrac xyyx,因为 x,yx,yx,y 都是正的所以其小数部分为 xy−⌊xy⌋\cfrac{x}{y}-\left\lfloor\cfrac xy\right\rflooryx−⌊yx⌋;若这个分数是合法的,考虑把这个分数的小数点右移若干位 lll,即 x10ly\cfrac{x10^l}yyx10l 的小数部分 x10ly−⌊x10ly⌋\cfrac{x10^l}{y}-\left\lfloor\cfrac {x10^l}y\right\rflooryx10l−⌊yx10l⌋ 应当与原来的小数部分一样。十进制下是乘 10l10^l10l,那么 kkk 进制下就是乘 klk^lkl。
xy−⌊xy⌋=xkly−⌊xkly⌋x−y⌊xy⌋=xkl−y⌊xkly⌋
\begin{aligned}\frac xy-\left\lfloor \frac xy\right\rfloor&=\frac{xk^l}{y}-\left\lfloor\frac {xk^l}y\right\rfloor\\x-y\left\lfloor \frac xy\right\rfloor&=xk^l-y\left\lfloor\frac {xk^l}y\right\rfloor\end{aligned}
yx−⌊yx⌋x−y⌊yx⌋=yxkl−⌊yxkl⌋=xkl−y⌊yxkl⌋
注意到这个式子相当于 x,xklx,xk^lx,xkl 对 yyy 取模后相当,于是有
x≡xkl(mody)
x\equiv xk^l\pmod y
x≡xkl(mody)
因为分数值相同的分数只记录一次贡献,因此我们只算最简分数的分数值,即 gcd(x,y)=1\gcd(x,y)=1gcd(x,y)=1,那么 xxx 在 mod y\bmod ymody 意义下就有逆元,两边同时乘 x−1x^{-1}x−1 得到
kl≡1(mody)
k^l\equiv 1\pmod y
kl≡1(mody)
我们发现这个式子与欧拉定理 aφ(p)≡1(modp)a^{\varphi(p)}\equiv 1\pmod paφ(p)≡1(modp) 很像。考虑欧拉定理要求 gcd(a,p)=1\gcd(a,p)=1gcd(a,p)=1,那么当 gcd(k,y)=1\gcd(k,y)=1gcd(k,y)=1 时只要 lll 取 φ(y)\varphi(y)φ(y) 就是一个合法的循环节长度。于是我们现在要求的式子就是
∑i=1n∑j=1m[gcd(i,j)=1][gcd(j,k)=1]
\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=1][\gcd(j,k)=1]
i=1∑nj=1∑m[gcd(i,j)=1][gcd(j,k)=1]
最终可以化简成
∑d=1min(n,m)[gcd(d,k)=1]μ(d)⌊nd⌋∑j=1⌊m/d⌋[gcd(j,k)=1]
\sum_{d=1}^{\min(n,m)}[\gcd(d,k)=1]\mu(d)\left\lfloor\frac nd\right\rfloor\sum_{j=1}^{\lfloor m/d\rfloor}[\gcd(j,k)=1]
d=1∑min(n,m)[gcd(d,k)=1]μ(d)⌊dn⌋j=1∑⌊m/d⌋[gcd(j,k)=1]
考虑令 g(n)=∑i=1n[gcd(i,k)=1]g(n)=\sum_{i=1}^n[\gcd(i,k)=1]g(n)=∑i=1n[gcd(i,k)=1],当枚举到 i>ki>ki>k 时有 gcd(i,k)=gcd(i−k,k)\gcd(i,k)=\gcd(i-k,k)gcd(i,k)=gcd(i−k,k),也就是说 iii 的贡献与 i−ki-ki−k 相同;进一步推广,枚举 iii 的过程中 [gcd(i,k)=1][\gcd(i,k)=1][gcd(i,k)=1] 的值以 kkk 为循环节循环变化。注意到 g(k)=φ(k)g(k)=\varphi(k)g(k)=φ(k),于是有
g(n)=⌊nk⌋φ(k)+g(n mod k)
g(n)=\left\lfloor \frac nk\right\rfloor\varphi(k)+g(n\bmod k)
g(n)=⌊kn⌋φ(k)+g(nmodk)
预处理 ∀i∈[0,k−1],g(i)\forall i\in[0,k-1],g(i)∀i∈[0,k−1],g(i) 的值就可以快速计算 g(n)g(n)g(n)。
现在还差 [gcd(d,k)=1]μ(d)[\gcd(d,k)=1]\mu(d)[gcd(d,k)=1]μ(d) 这一项,我们设其为 q(d)=[gcd(d,k)=1]μ(d)q(d)=[\gcd(d,k)=1]\mu(d)q(d)=[gcd(d,k)=1]μ(d)。显然这个函数是积性函数,考虑用杜教筛,构造出满足 f∗q=cf*q=cf∗q=c 的函数 f,cf,cf,c。考虑把卷积展开:
c(n)=∑d∣nf(d)[gcd(n/d,k)=1]μ(n/d)=∑d∣nf(d)μ(n/d)[gcd(n/d,k)=1]
\begin{aligned}c(n)&=\sum_{d|n}f(d)[\gcd(n/d,k)=1]\mu(n/d)\\&=\sum_{d|n}f(d)\mu(n/d)[\gcd(n/d,k)=1]\end{aligned}
c(n)=d∣n∑f(d)[gcd(n/d,k)=1]μ(n/d)=d∣n∑f(d)μ(n/d)[gcd(n/d,k)=1]
考虑 gcd(a,b)=1,gcd(a,c)=1⟺gcd(a,bc)=1\gcd(a,b)=1, \gcd(a,c)=1\Longleftrightarrow\gcd(a,bc)=1gcd(a,b)=1,gcd(a,c)=1⟺gcd(a,bc)=1,我们考虑令 f(d)=[gcd(d,k)=1]f(d)=[\gcd(d,k)=1]f(d)=[gcd(d,k)=1],那么有
c(n)=∑d∣n[gcd(d,k)=1][gcd(n/d,k)=1]μ(n/d)=∑d∣n[gcd(n,k)=1]μ(n/d)=[gcd(n,k)=1]∑d∣nμ(n/d)=[gcd(n,k)=1][n=1]=[n=1]
\begin{aligned}c(n)&=\sum_{d|n}[\gcd(d,k)=1][\gcd(n/d,k)=1]\mu(n/d)\\&=\sum_{d|n}[\gcd(n,k)=1]\mu(n/d)\\&=[\gcd(n,k)=1]\sum_{d|n}\mu(n/d)\\&=[\gcd(n,k)=1][n=1]=[n=1]\end{aligned}
c(n)=d∣n∑[gcd(d,k)=1][gcd(n/d,k)=1]μ(n/d)=d∣n∑[gcd(n,k)=1]μ(n/d)=[gcd(n,k)=1]d∣n∑μ(n/d)=[gcd(n,k)=1][n=1]=[n=1]
我们就可以得到 c=ϵc=\epsilonc=ϵ,又发现 fff 的前缀和就是 ggg,然后就可以快乐杜教筛力(喜
Powerful Number
对于一个正整数 nnn,称 nnn 是 powerful number 当且仅当 nnn 的所有质因子次数至少为 222。
- nnn 以内 powerful number 的个数是严格 Θ(n)\Theta(\sqrt n)Θ(n) 的。
- 枚举 powerful number 的方法:线性筛筛出 O(n)O(\sqrt n)O(n) 以内的质数,然后 dfs 枚举这些质数的次数即可。
- 因为 h=f∗g−1h=f*g^{-1}h=f∗g−1,积性函数卷积性函数的逆还是积性函数,因此只需要计算 h(pk)h(p^k)h(pk) 上的值,然后乘起来即可。有两种方法:
- 直接推一个关于 p,kp,kp,k 的式子表示出 h(pk)h(p^k)h(pk);
- 考虑 f=h∗gf=h*gf=h∗g,展开有 f(pk)=∑i=0kg(pi)h(pk−i)f(p^k)=\sum_{i=0}^k g(p^i)h(p^{k-i})f(pk)=∑i=0kg(pi)h(pk−i),把 i=0i=0i=0 这一项提出并移项,可得 h(pk)=f(pk)−∑i=1kg(pi)h(pk−i)h(p^k)=f(p^k)-\sum_{i=1}^k g(p^i)h(p^{k-i})h(pk)=f(pk)−∑i=1kg(pi)h(pk−i),可以递推求解,也可以预处理。
给定函数 f(x)f(x)f(x),满足:
- f(1)=1f(1)=1f(1)=1;
- f(pc)=pxorcf(p^c)=p\operatorname{xor} cf(pc)=pxorc,其中 ppp 是质数,ccc 是正整数;
- f(ab)=f(a)×f(b)f(ab)=f(a)\times f(b)f(ab)=f(a)×f(b),其中 gcd(a,b)=1\gcd(a,b)=1gcd(a,b)=1。
给定 nnn,求
(∑i=1nf(i))(mod109+7) \left(\sum_{i=1}^n f(i)\right)\pmod {10^9+7} (i=1∑nf(i))(mod109+7)
从第二条可以推出对于质数 ppp,当 p=2p=2p=2 时 f(p)=p+1f(p)=p+1f(p)=p+1;否则 f(p)=p−1f(p)=p-1f(p)=p−1。我们构造函数 ggg,满足当 xxx 是偶数时 g(x)=3φ(x)g(x)=3\varphi(x)g(x)=3φ(x),否则 g(x)=φ(x)g(x)=\varphi(x)g(x)=φ(x)。容易证明 ggg 是积性函数,设 G(n)=∑i=1ng(i)G(n)=\sum_{i=1}^n g(i)G(n)=∑i=1ng(i),根据 PN 筛的公式有
∑i=1nf(i)=∑i=1n[i is powerful]h(i)G(⌊n/i⌋)
\sum_{i=1}^nf(i)=\sum_{i=1}^n[i\text{ is powerful}]h(i)G(\lfloor n/i\rfloor)
i=1∑nf(i)=i=1∑n[i is powerful]h(i)G(⌊n/i⌋)
其中 h=f∗g−1h=f*g^{-1}h=f∗g−1。假设已经知道 GGG 在 nnn 的整除点上的取值,那么现在只差 hhh 在 powerful number 上的取值。在 dfs 枚举 powerful number 的过程中,假设枚举到质数 ppp 的 ccc 次方,现在枚举到的 powerful number 是 d=d′×pcd=d'\times p^cd=d′×pc,并且我们已经求得 h(d′)h(d')h(d′)。显然 d′d'd′ 与 pcp^cpc 互质,于是 h(d)=h(d′)×h(pc)h(d)=h(d')\times h(p^c)h(d)=h(d′)×h(pc),h(pc)h(p^c)h(pc) 可以用递推的方法预处理并且存下来。
现在考虑算 G(n)G(n)G(n)。
G(n)=∑i=1⌊n/2⌋3φ(2i)+∑i=1n−⌊n/2⌋φ(2i−1)=∑i=1nφ(i)+2∑i=1⌊n/2⌋φ(2i)
\begin{aligned}G(n)&=\sum_{i=1}^{\lfloor n/2\rfloor}3\varphi(2i)+\sum_{i=1}^{n-\lfloor n/2\rfloor}\varphi(2i-1)\\&=\sum_{i=1}^n\varphi(i)+2\sum_{i=1}^{\lfloor n/2\rfloor} \varphi(2i)\end{aligned}
G(n)=i=1∑⌊n/2⌋3φ(2i)+i=1∑n−⌊n/2⌋φ(2i−1)=i=1∑nφ(i)+2i=1∑⌊n/2⌋φ(2i)
第一个求和可以用杜教筛,令 s(n)=∑i=1nφ(2i)s(n)=\sum_{i=1}^n\varphi(2i)s(n)=∑i=1nφ(2i),考虑分别计算 iii 是奇数和偶数的情况:
s(n)=(∑i=1⌊n/2⌋φ(2(2i−1))+φ(2(2i)))+[n mod 2=1]φ(2n)
s(n)=\left(\sum_{i=1}^{\lfloor n/2\rfloor}\varphi(2(2i-1))+\varphi(2(2i))\right)+[n\bmod 2=1]\varphi(2n)
s(n)=i=1∑⌊n/2⌋φ(2(2i−1))+φ(2(2i))+[nmod2=1]φ(2n)
注意到 2i−12i-12i−1 总是与 222 互质,于是前一项就等于 φ(2)⋅φ(2i−1)=φ(2i−1)\varphi(2)\cdot\varphi(2i-1)=\varphi(2i-1)φ(2)⋅φ(2i−1)=φ(2i−1);而 2i2i2i 总是 222 的倍数,于是后一项就等于 2φ(2i)2\varphi(2i)2φ(2i)。于是可以发现 s(n)=s(⌊n/2⌋)+∑i=1nφ(i)s(n)=s(\lfloor n/2\rfloor)+\sum_{i=1}^n\varphi(i)s(n)=s(⌊n/2⌋)+∑i=1nφ(i),可以递归计算。