当前位置: 首页 > java >正文

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,m1010

最终只需计算 ∑d=1min⁡(n,m)μ(d)⌊n/d⌋⌊m/d⌋\sum_{d=1}^{\min(n,m)}\mu(d)\lfloor n/d\rfloor\lfloor m/d\rfloord=1min(n,m)μ(d)n/dm/d,瓶颈在于计算 μ\muμ 在若干个点上的前缀和,这些点一定属于 nnnmmm 的整除点集合 Dn,DmD_n,D_mDn,Dm(就是使得 ⌊n/i⌋≠⌊n/(i+1)⌋\lfloor n/i\rfloor\ne \lfloor n/(i+1)\rfloorn/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)iDnDm,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\rfloorjin=ijn我的整除的整除还是我的整除

现在问题变成快速求 f,hf,hf,h 的前缀和。注意到 1∗φ=id1*\varphi=\mathrm{id}1φ=id1∗μ=ϵ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,m1010

直接使用杜教筛算出 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,k1091≤l≤r≤1091\le l\le r\le 10^91lr109,有 T≤10T\le 10T10 组数据。

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⌊(l1)/k)n。根据两个函数的定义有 g(k)=∑k∣if(i)g(k)=\sum_{k|i} f(i)g(k)=kif(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)=kiμ(k/i)g(i)=iNμ(i)g(ik)=iNμ(i)(ir/ki⌊(l1)/k)
整除分块即可。注意到两个整除只要有一项非 000 就有贡献,因此枚举时应枚举到 rrr 而不是 l−1l-1l1

给定 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}yxkkk 进制下表示成小数形式后,小数部分可以表示成 c1c2c3⋯cpc1c2⋯‾\overline{c_1c_2c_3\cdots c_pc_1c_2\cdots}c1c2c3cpc1c2 的无限循环形式的 (x,y)(x,y)(x,y) 对数。分数值相同只算一次。

1≤n,m≤1091\le n,m\le 10^91n,m1092≤k≤2×1032\le k\le 2\times 10^32k2×103

假设 k=10k=10k=10,那么对于分数 xy\cfrac xyyx,因为 x,yx,yx,y 都是正的所以其小数部分为 xy−⌊xy⌋\cfrac{x}{y}-\left\lfloor\cfrac xy\right\rflooryxyx;若这个分数是合法的,考虑把这个分数的小数点右移若干位 lll,即 x10ly\cfrac{x10^l}yyx10l 的小数部分 x10ly−⌊x10ly⌋\cfrac{x10^l}{y}-\left\lfloor\cfrac {x10^l}y\right\rflooryx10lyx10l 应当与原来的小数部分一样。十进制下是乘 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} yxyxxyyx=yxklyxkl=xklyyxkl
注意到这个式子相当于 x,xklx,xk^lx,xklyyy 取模后相当,于是有
x≡xkl(mody) x\equiv xk^l\pmod y xxkl(mody)
因为分数值相同的分数只记录一次贡献,因此我们只算最简分数的分数值,即 gcd⁡(x,y)=1\gcd(x,y)=1gcd(x,y)=1,那么 xxx mod y\bmod ymody 意义下就有逆元,两边同时乘 x−1x^{-1}x1 得到
kl≡1(mody) k^l\equiv 1\pmod y kl1(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=1nj=1m[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=1min(n,m)[gcd(d,k)=1]μ(d)dnj=1m/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(ik,k),也就是说 iii 的贡献与 i−ki-kik 相同;进一步推广,枚举 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,k1],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=cfq=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)=dnf(d)[gcd(n/d,k)=1]μ(n/d)=dnf(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)=1gcd(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)=dn[gcd(d,k)=1][gcd(n/d,k)=1]μ(n/d)=dn[gcd(n,k)=1]μ(n/d)=[gcd(n,k)=1]dnμ(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=fg1,积性函数卷积性函数的逆还是积性函数,因此只需要计算 h(pk)h(p^k)h(pk) 上的值,然后乘起来即可。有两种方法:
    • 直接推一个关于 p,kp,kp,k 的式子表示出 h(pk)h(p^k)h(pk)
    • 考虑 f=h∗gf=h*gf=hg,展开有 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(pki),把 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(pki),可以递推求解,也可以预处理。

给定函数 f(x)f(x)f(x),满足:

  • f(1)=1f(1)=1f(1)=1
  • f(pc)=pxor⁡cf(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=1nf(i))(mod109+7)

从第二条可以推出对于质数 ppp,当 p=2p=2p=2f(p)=p+1f(p)=p+1f(p)=p+1;否则 f(p)=p−1f(p)=p-1f(p)=p1。我们构造函数 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=1nf(i)=i=1n[i is powerful]h(i)G(⌊n/i⌋)
其中 h=f∗g−1h=f*g^{-1}h=fg1。假设已经知道 GGGnnn 的整除点上的取值,那么现在只差 hhh 在 powerful number 上的取值。在 dfs 枚举 powerful number 的过程中,假设枚举到质数 pppccc 次方,现在枚举到的 powerful number 是 d=d′×pcd=d'\times p^cd=d×pc,并且我们已经求得 h(d′)h(d')h(d)。显然 d′d'dpcp^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=1n/23φ(2i)+i=1nn/2φ(2i1)=i=1nφ(i)+2i=1n/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=1n/2φ(2(2i1))+φ(2(2i))+[nmod2=1]φ(2n)
注意到 2i−12i-12i1 总是与 222 互质,于是前一项就等于 φ(2)⋅φ(2i−1)=φ(2i−1)\varphi(2)\cdot\varphi(2i-1)=\varphi(2i-1)φ(2)φ(2i1)=φ(2i1);而 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),可以递归计算。

http://www.xdnf.cn/news/15162.html

相关文章:

  • Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
  • 系统分析师-计算机系统-计算机系统概述存储系统
  • 《Java Web程序设计》实验报告二 学习使用HTML标签、表格、表单
  • 【学习笔记】Linux命令
  • 蓝牙BT UUID的含义以及使用方法案例说明
  • JavaScript加强篇——第七章 浏览器对象与存储要点
  • 《Java Web程序设计》实验报告四 Java Script前端应用和表单验证
  • OpenCL study - code02
  • docker网络与数据持久化
  • 大数据时代UI前端的智能化服务升级:基于用户情境的主动服务设计
  • Elasticsearch 的 `modules` 目录
  • 使用Matlab整车模型进行电动汽车能耗仿真测试方法
  • 【飞算JavaAI】一站式智能开发,驱动Java开发全流程革新
  • 鸿蒙的NDK开发初级入门篇
  • Apache Iceberg数据湖高级特性及性能调优
  • 如何使用postman做接口测试?
  • 《Spring 中上下文传递的那些事儿》Part 8:构建统一上下文框架设计与实现(实战篇)
  • 安全初级作业1
  • Linux中的git命令
  • 【LeetCode 热题 100】24. 两两交换链表中的节点——(解法一)迭代+哨兵
  • 设计模式 - 面向对象原则:SOLID最佳实践
  • vscode 中的 mermaid
  • 【高等数学】第三章 微分中值定理与导数的应用——第三节 泰勒公式
  • Python 【技术面试题和HR面试题】➕ 循环结构、控制语句及综合应用问答
  • C++编程基础
  • 端口到底是个什么鬼?回答我!
  • pyQt基础4(对话框)
  • softmax回归的从零开始实现
  • php的原生类
  • 《棒球规则介绍》领队和主教练谁说了算·棒球1号位