2023.01.26 数论 学习笔记
讲课人:罗恺。
学习/复习了很多数论算法。
有些题没有分析复杂度,要么是不会分析,要么是分析出来全是常数。
Pohlig-Hellman
问题:给定 aa,质数 pp 和 pp 的一个原根 gg,求 xx 使得 gx≡a(modp)gx≡a(modp)。
不妨 0≤a<p0≤a<p。特判掉 a=0,1a=0,1,只需考虑 2≤a<p2≤a<p 的情况。
直接 BSGS 的复杂度是 O(√p)O(√p) 的,如果 pp 达到了 10181018 就没救了。此时如果 pp 满足一些性质,例如 p−1p−1 的所有质因子都比较小,就可以用 Pohlig-Hellman 来求解。
我们先把 p−1p−1 分解质因数,设 p−1=pα11pα22⋯pαkkp−1=pα11pα22⋯pαkk。假设我们能求出 xx 模 pα11pα11 的余数,那么我们也可以求出 xx 模 pα22∼pαkkpα22∼pαkk 的余数,从而用 CRT 把 xx 求出。
考虑怎么求 xx 模 pα11pα11 的余数。将 xx 用 p1p1 进制表出,即设 x=∑α1−1i=0pi1ai⋯(1)x=∑α1−1i=0pi1ai⋯(1),其中 0≤ai≤p1−10≤ai≤p1−1。由于原问题在 [0,p−1][0,p−1] 中有唯一解,因此 aiai 存在且唯一。
假设我们已经求出了 a0∼ar−1a0∼ar−1,考虑怎么求 arar。我们已知 gx≡a(modp)gx≡a(modp),那么 gxp−1pr+11≡ap−1pr+11(modp)gxp−1pr+11≡ap−1pr+11(modp),代入 (1)(1) 式得,g∑α1−1i=0pi1aip−1pr+11≡ap−1pr+11(modp)g∑α1−1i=0pi1aip−1pr+11≡ap−1pr+11(modp),我们发现当 i>ri>r 时左式指数一定是 p−1p−1 的倍数,而 gp−1≡1(modp)gp−1≡1(modp),因此左式仅需考虑 i≤ri≤r 时的指数。
因此有 g∑r−1i=0pi1aip−1pr+11garp−1p1≡ap−1pr+11(modp)g∑r−1i=0pi1aip−1pr+11garp−1p1≡ap−1pr+11(modp),O(p1)O(p1) 枚举 arar 并检验是否合法即可。
总时间复杂度 O(∑ki=1αi(pi+loga))O(∑ki=1αi(pi+loga))。
应用:HDU6632 discrete logarithm problem。
首先找到 pp 的原根 gg。可以用 Pohlig-Hellman 求出 a=ga1,b=gb1a=ga1,b=gb1,于是问题变为找 xx 使得 ga1x≡gb1(modp)ga1x≡gb1(modp),即 a1x≡b1(modp−1)a1x≡b1(modp−1),可以用 exgcd 或快速幂求解。
Min_25 筛
能用 Min_25 筛算前缀和的函数 f(x)f(x) 一般需满足以下性质:对于质数 pp,f(p)f(p) 是一个关于 pp 的项数较少的多项式,且 f(pc)f(pc) 可以快速计算。
整个过程分为两部分:1. 对所有 x∈{⌊nd⌋|1≤d≤n}x∈{⌊nd⌋|1≤d≤n} 求出不超过 xx 的所有质数的 ff 之和。2. 对所有 x∈{⌊nd⌋|1≤d≤n}x∈{⌊nd⌋|1≤d≤n} 求出不超过 xx 的所有数的 ff 之和。
第一部分:
由于对于质数 pp,f(p)f(p) 是一个关于 pp 的项数较少的多项式,所以我们可以把它拆成若干个单项式的和,最后再把每一项的结果加起来就可以了。
现在我们考虑怎么求出 g(p)=pkg(p)=pk 的前缀和。
设 pipi 为第 ii 小的质数,如 p1=2,p2=3p1=2,p2=3,特别地,认为所有质数都 >p0>p0(尽管 p0p0 无意义)。设不超过 nn 的质数有 tntn 个。令 sumisumi 等于前 ii 小的质数的 gg 之和。令 G(n,x)G(n,x) 等于 nn 以内的所有质数以及所有最小质因子大于 pxpx 的合数的 gg 之和。
首先 G(n,0)=∑ni=2g(i)G(n,0)=∑ni=2g(i) 可以快速计算。如果我们已知 G(n,x−1)G(n,x−1),怎么求 G(n,x)G(n,x)?可以发现,G(n,x−1)G(n,x−1) 和 G(n,x)G(n,x) 相比多了 nn 以内最小质因子等于 pxpx 的合数的 gg 之和。
因此,如果 p2x>np2x>n,则 G(n,x)=G(n,x−1)G(n,x)=G(n,x−1);否则,因为 gg 是完全积性函数,所以 G(n,x)=G(n,x−1)−g(px)(G(⌊npx⌋,x−1)−sumx−1)G(n,x)=G(n,x−1)−g(px)(G(⌊npx⌋,x−1)−sumx−1)。
关于 GG,其第一维一定形如 ⌊nd⌋(1≤d≤n)⌊nd⌋(1≤d≤n) 的形式。关于 sumsum,只需预处理前 t⌊√n⌋t⌊√n⌋ 项。
不超过 nn 的所有质数的 gg 之和就是 G(n,tn)G(n,tn)。进而可以求出不超过 nn 的所有质数的 ff 之和 GnGn。
第二部分:
令 F(n,x)F(n,x) 等于 nn 以内的所有大于 pxpx 的质数以及所有最小质因子大于 pxpx 的合数的 ff 之和。不妨 px≤npx≤n。
对于质数的部分,其贡献为 Gn−sumxGn−sumx。
对于合数的部分,枚举最小质因子 pi(i>x)pi(i>x) 及其出现次数 ee,则贡献为 f(pei)(F(⌊npei⌋,i)+[e>1])f(pei)(F(⌊npei⌋,i)+[e>1])。
原问题的答案就是 F(n,0)+f(1)F(n,0)+f(1)。直接递归求解,不用记忆化。
总时间复杂度据说可以被证明是 O(n1−ϵ)O(n1−ϵ) 或者 O(n34logn)O(n34logn) 的。
1.P3726 [AH2017/HNOI2017] 抛硬币
首先让 A 先抛 a−ba−b 次,枚举 A 在这 a−ba−b 次中正面朝上的次数 yy,则方案数为 (a−by)(a−by)。接下来 A 和 B 要一起抛 bb 次,A 要获胜等价于在这 bb 次中 A 正面朝上的次数减 B 正面朝上的次数 ≥1−y≥1−y。如果是要求 A 正面朝上的次数减 B 正面朝上的次数恰好等于某个数,则可以枚举 A、B 正面朝上的次数,用组合数表示,可以用范德蒙德卷积进行优化,由于模数不是质数,所以这部分的时间复杂度取决于 exLucas 的复杂度,即 O(2k+5k)O(2k+5k) 预处理,O(loga)O(loga) 单次查询。同时注意到 y=1y=1 时是很好算的,且知道 yy 时的答案可以通过再计算一个组合数推出 y−1y−1 或 y+1y+1 时的答案,且 0≤y≤a−b0≤y≤a−b,所以一共要算 O(a−b)O(a−b) 个组合数。
总时间复杂度 O(2k+5k+(a−b)loga)O(2k+5k+(a−b)loga),空间复杂度 O(5k)O(5k)。
2.CF986F Oppa Funcan Style Remastered
首先只可能用 kk 的质因子。
如果 kk 只有一个质因子,那做完了。
如果 kk 只有两个质因子,把式子列出来后可以 exgcd 判。
如果 kk 有至少三个质因子,则最小的质因子不超过 O(k13)O(k13),可以同余最短路。
设有 tktk 个不同的 kk,则时间复杂度为 O(tlogk+√k+tk(√klnk+k13log2k))O(tlogk+√k+tk(√klnk+k13log2k)),空间复杂度 O(t+√kω+√klnk+k13)O(t+√kω+√klnk+k13)。
3.CF571E Geometric Progressions
设在 a,ba,b 中出现过的质因子有 tt 个,分别为 p1∼ptp1∼pt。设 ai=∏tj=1pci,jj,bi=∏tj=1pdi,jjai=∏tj=1pci,jj,bi=∏tj=1pdi,jj。假如有解,不妨设其中一组解是 a1bx11=⋯=anbxnna1bx11=⋯=anbxnn。
t=1t=1 时可以 exCRT 求解,n=1n=1 时可以特判。不妨设 t,n≥2t,n≥2。
如果存在 i,ji,j 使得 di,j=0di,j=0,考虑所有 dx,j(1≤x≤n)dx,j(1≤x≤n)。如果 dx,jdx,j 全都为 00,看 cx,jcx,j 是否全部相等,如果全部相等则可以忽略质因子 pjpj,否则无解;如果 dx,jdx,j 中有不为 00 的,那么用 di,j=0di,j=0 和 dx,j≠0dx,j≠0 的列个方程可以发现最多有一个可行解,验证下是否合法即可。
现在所有剩余的 dd 都不为 00 了。如果有解,考虑 j∈[2,t]j∈[2,t],要满足对于 2≤i≤n,2≤i≤n,,都有 c1,1+x1d1,1=ci,1+xidi,1,c1,j+x1d1,j=ci,j+xidi,jc1,1+x1d1,1=ci,1+xidi,1,c1,j+x1d1,j=ci,j+xidi,j,移项得 x1d1,1−xidi,1=ci,1−c1,1,x1d1,j−xidi,j=ci,j−c1,jx1d1,1−xidi,1=ci,1−c1,1,x1d1,j−xidi,j=ci,j−c1,j。如果存在 ii 满足 d1,1d1,j≠di,1di,jd1,1d1,j≠di,1di,j,则至多有一个可行解,检验即可;否则,如果存在 ii 使得 d1,1d1,j≠ci,1−c1,1ci,j−c1,jd1,1d1,j≠ci,1−c1,1ci,j−c1,j,则无解;否则,可以忽略质因子 pjpj。
重复上述过程直至 t=1t=1 为止即可。
时间复杂度 O(√a+n√alna+n2loga)O(√a+n√alna+n2loga),空间复杂度 O(√aω+alna+n2loga)O(√aω+alna+n2loga)。
4.UOJ#188. 【UR #13】Sanrd
类似 Min_25 筛。
差分后,原问题等价于求 1∼n1∼n 的次大质因子之和。
设 F(n,x)F(n,x) 等于 nn 以内的所有最小质因子大于 pxpx 的合数的次大质因子之和。设不超过 nn 的质数有 tntn 个。
枚举合数的最小质因子 pi(i>x)pi(i>x) 及其出现次数 ee,则该合数除去 peipei 后可能为合数、质数、或者 11,故有转移 F(n,x)=∑i>x,p2i≤n∑e≥1(F(⌊npei⌋,i)+(max(t⌊npei⌋−x,0)+[e>1])pi)F(n,x)=∑i>x,p2i≤n∑e≥1(F(⌊npei⌋,i)+(max(t⌊npei⌋−x,0)+[e>1])pi)。
同样的 tt 只有下标为 ⌊nd⌋(1≤d≤n)⌊nd⌋(1≤d≤n) 的位置的值有用,FF 第一维也只可能是 ⌊nd⌋⌊nd⌋ 的形式。根据前文 Min_25 筛的部分,可以看出求出所有需要的 tt 就是第一部分,求 FF 就类似于第二部分。
问题的答案就是 F(n,0)F(n,0)。直接递归求解,不用记忆化。
时间复杂度 O(r1−ϵ)O(r1−ϵ) 或 O(r34logr)O(r34logr),空间复杂度 O(√r)O(√r)。
5.P5172 Sum
首先特判掉 rr 是完全平方数的情况。
我们发现,(−1)a=1−2(amod2)=1−2(a−2⌊a2⌋)(−1)a=1−2(amod2)=1−2(a−2⌊a2⌋),因此原式等于 n−2∑ni=1⌊i√r⌋+4∑ni=1⌊i√r2⌋n−2∑ni=1⌊i√r⌋+4∑ni=1⌊i√r2⌋。
令 t=√rt=√r,令 f(n,a,b,c)=∑ni=1⌊iat+bc⌋f(n,a,b,c)=∑ni=1⌊iat+bc⌋,答案即为 n−2f(n,1,0,1)+4f(n,1,0,2)n−2f(n,1,0,1)+4f(n,1,0,2)。
考虑怎么求 f(n,a,b,c)f(n,a,b,c),要求 a,c≠0a,c≠0。如果 at+bcat+bc 不在 [0,1)[0,1) 间,则可以把 at+bcat+bc 的整数部分先提出来(即将 bb 减去某个值),使得 at+bcat+bc 在 [0,1)[0,1) 间。
f(n,a,b,c)=∑ni=1⌊iat+bc⌋=∑ni=1∑⌊nat+bc⌋j=1[⌊iat+bc⌋≥j]=∑ni=1∑⌊nat+bc⌋j=1[iat+bc≥j]f(n,a,b,c)=∑ni=1⌊iat+bc⌋=∑ni=1∑⌊nat+bc⌋j=1[⌊iat+bc⌋≥j]=∑ni=1∑⌊nat+bc⌋j=1[iat+bc≥j],由于 a≠0a≠0 且 rr 不为完全平方数,所以不等号两边不会相等,因此 f(n,a,b,c)=∑ni=1∑⌊nat+bc⌋j=1[iat+bc>j]=∑ni=1∑⌊nat+bc⌋j=1[jcat+b<i]=∑ni=1∑⌊nat+bc⌋j=1[jc(at−b)(at+b)(at−b)<i]=∑ni=1∑⌊nat+bc⌋j=1[jc(at−b)a2r−b2<i]=∑⌊nat+bc⌋j=1∑ni=1[jc(at−b)a2r−b2<i]=∑⌊nat+bc⌋j=1∑ni=1[⌊jc(at−b)a2r−b2⌋<i]=∑⌊nat+bc⌋j=1(n−⌊jc(at−b)a2r−b2⌋)=n⌊nat+bc⌋−∑⌊nat+bc⌋j=1⌊jc(at−b)a2r−b2⌋=n⌊nat+bc⌋−f(⌊nat+bc⌋,ca,−cb,a2r−b2)f(n,a,b,c)=∑ni=1∑⌊nat+bc⌋j=1[iat+bc>j]=∑ni=1∑⌊nat+bc⌋j=1[jcat+b<i]=∑ni=1∑⌊nat+bc⌋j=1[jc(at−b)(at+b)(at−b)<i]=∑ni=1∑⌊nat+bc⌋j=1[jc(at−b)a2r−b2<i]=∑⌊nat+bc⌋j=1∑ni=1[jc(at−b)a2r−b2<i]=∑⌊nat+bc⌋j=1∑ni=1[⌊jc(at−b)a2r−b2⌋<i]=∑⌊nat+bc⌋j=1(n−⌊jc(at−b)a2r−b2⌋)=n⌊nat+bc⌋−∑⌊nat+bc⌋j=1⌊jc(at−b)a2r−b2⌋=n⌊nat+bc⌋−f(⌊nat+bc⌋,ca,−cb,a2r−b2)。由于 rr 不为完全平方数,所以 a2ra2r 不为完全平方数,所以 a2r−b2≠0a2r−b2≠0;由于原先 a,c≠0a,c≠0,所以现在 ca≠0ca≠0,因此 f(⌊nat+bc⌋,ca,−cb,a2r−b2)f(⌊nat+bc⌋,ca,−cb,a2r−b2) 仍满足我们的要求,可以递归求解。由于 n>0n>0 时每递归一次 nn 至少减少 11,n=0n=0 时答案为 00,所以可以在有限步内得到答案。
上述做法的正确性是显然的。但是还有两个问题,一是 ff 的递归层数是多少(这会影响时间复杂度),二是在递归的过程中 ff 的四维参数值域会有多大(这会影响用什么类型的变量存储)。
先分析前者。假设递归到 f(n,a,b,c)f(n,a,b,c) 时把 at+bcat+bc 调整到 [0,1)[0,1) 间后 a,b,ca,b,c 分别变成了 a′,b′,c′a′,b′,c′,那么下一层递归就是 f(⌊na′t+b′c′⌋,c′a′,−c′b′,a′2r−b′2)f(⌊na′t+b′c′⌋,c′a′,−c′b′,a′2r−b′2),令 A=c′a′,B=−c′b′,C=a′2r−b′2A=c′a′,B=−c′b′,C=a′2r−b′2,即递归到 f(⌊na′t+b′c′⌋,A,B,C)f(⌊na′t+b′c′⌋,A,B,C)。设递归到 f(⌊na′t+b′c′⌋,A,B,C)f(⌊na′t+b′c′⌋,A,B,C) 时把 At+BCAt+BC 调整到 [0,1)[0,1) 间后 A,B,CA,B,C 分别变成了 A′,B′,C′A′,B′,C′,那么再下一层递归就是 f(⌊⌊na′t+b′c′⌋A′t+B′C′⌋,C′A′,−C′B′,A′2r−B′2)f(⌊⌊na′t+b′c′⌋A′t+B′C′⌋,C′A′,−C′B′,A′2r−B′2)。可以发现,A′t+B′C′A′t+B′C′ 其实就是 At+BCAt+BC 的小数部分(xx 的小数部分 {x}{x} 定义为 x−⌊x⌋x−⌊x⌋),而 At+BC=c′a′t−c′b′a′2r−b′2=c′(a′t−b′)(a′t−b′)(a′t+b′)=c′a′t+b′At+BC=c′a′t−c′b′a′2r−b′2=c′(a′t−b′)(a′t−b′)(a′t+b′)=c′a′t+b′,因此 f(n,a,b,c)f(n,a,b,c) 递归两层后变成 f(⌊⌊na′t+b′c′⌋{c′a′t+b′}⌋,C′A′,−C′B′,A′2r−B′2)f(⌊⌊na′t+b′c′⌋{c′a′t+b′}⌋,C′A′,−C′B′,A′2r−B′2)。令 n′=⌊⌊na′t+b′c′⌋{c′a′t+b′}⌋n′=⌊⌊na′t+b′c′⌋{c′a′t+b′}⌋,令 x=a′t+b′c′(x<1)x=a′t+b′c′(x<1),则 n′=⌊⌊nx⌋{1x}⌋≤nx{1x}n′=⌊⌊nx⌋{1x}⌋≤nx{1x},不难发现 nx{1x}nx{1x} 取到最大值时 1<1x<21<1x<2,故设 1x=1+y1x=1+y,其中 0<y<10<y<1,则 nx{1x}≤ny1+ynx{1x}≤ny1+y,可以发现 y1+y<12y1+y<12,故 n′≤ny1+y<n2n′≤ny1+y<n2。也就是说,每经过两次递归,nn 就至少除以 22,那么递归层数就是 O(logn)O(logn) 的。
对于后者,我们要在递归计算 ff 时加一个优化:把 a,b,ca,b,c 同时除以 gcd(a,b,c)gcd(a,b,c)。根据定义这显然是对的,并且可以在一定程度上减小 a,b,ca,b,c 的值域。下面我们说明,在题目给定数据范围内,加上这个优化后,只要用 long long 存储就可以了。
首先,可以发现 ff 在递归的过程中 nn 会越变越小,除此之外,a,b,ca,b,c 三维的变化不受 nn 的影响,只受它们本身的值和 rr 的影响,nn 只起到了控制递归轮数的作用,并且 nn 越大递归轮数越多。所以我们只要说明对于每个 rr,在 n=nmaxn=nmax(本题中 nmax=109nmax=109)时,a,b,ca,b,c 三维都不会太大即可。
事实上,我们只需将 r=1,n=109r=1,n=109,r=2,n=109r=2,n=109,……,r=104,n=109r=104,n=109 都代入我们上面所说的做法中运行一遍,得出结果:aa 始终在 [1,790][1,790] 间,bb 始终在 [−199,78605][−199,78605] 间,cc 始终在 [1,39788][1,39788] 间,因此用 long long 存储是完全够用的。
上述做法在 n,rn,r 上界更大时并不一定能说明值域不会太大,因此如果你有能在任意 n,rn,r 的情况下都可以直接分析出 a,b,ca,b,c 三者的值域范围的做法可以在评论区分享一下。
每层递归内的时间复杂度瓶颈在于算 gcd(a,b,c)gcd(a,b,c),这是 O(logmin(|a|,|b|,|c|))O(logmin(|a|,|b|,|c|)) 的。
总时间复杂度 O(tlognlogmin(|a|max,|b|max,|c|max))O(tlognlogmin(|a|max,|b|max,|c|max)),本题中 min(|a|max,|b|max,|c|max)=790min(|a|max,|b|max,|c|max)=790,空间复杂度 O(1)O(1)。
6.CF1770F Koxia and Sequence
如果 n≥2n≥2,考虑所有合法的 {a}{a} 中,如果 an−1≠anan−1≠an,则可以交换 an−1,anan−1,an,将这样的序列两两配对,可以发现该情况对答案是没有贡献的;如果 an−1=anan−1=an,则对答案的贡献相当于前 n−2n−2 个数异或起来,此时如果 n−2≥2n−2≥2,我们再考虑 an−3an−3 和 an−2an−2 是否相等,同理可以发现不相等对答案没有贡献,相等则只用考虑前 n−4n−4 个数异或起来的结果。如此不断考虑可以发现,如果 nn 为偶数则答案为 00,如果 nn 为奇数则答案为所有合法的 {a}{a} 中,a1a1 的异或和。
接下来我们把 nn 个数的或等于 yy 的限制容斥掉,对每个 y′⊆yy′⊆y 都算出 nn 个数的或为 y′y′ 的子集的答案 f(y′)f(y′),最终答案就是 ⨁y′⊆yf(y′)⨁y′⊆yf(y′)(⨁⨁ 代表异或)。
枚举 y′y′,现在所有 ai⊆y′ai⊆y′。考虑二进制下从低往高第 ii 位的答案,如果 y′y′ 的第 ii 位为 00 则答案为 00,否则,aa 对第 ii 位有贡献当且仅当 a1a1 的第 ii 位为 11。那么,我们现在要统计的就是 a1⊆y′−2i,a2∼an⊆y′,2i+∑nj=1aj=xa1⊆y′−2i,a2∼an⊆y′,2i+∑nj=1aj=x 的方案数。即 ∑a1+⋯+an=x−2i[a1⊆y′−2i][a2⊆y′]⋯[an⊆y′]∑a1+⋯+an=x−2i[a1⊆y′−2i][a2⊆y′]⋯[an⊆y′]。由于 [a⊆b]=(ba)mod2[a⊆b]=(ba)mod2,所以上式等于 (∑a1+⋯+an=x−2i(y′−2ia1)(y′a2)⋯(y′an))mod2(∑a1+⋯+an=x−2i(y′−2ia1)(y′a2)⋯(y′an))mod2,由范德蒙德卷积该式等于 (ny′−2ix−2i)mod2=[x−2i⊆ny′−2i](ny′−2ix−2i)mod2=[x−2i⊆ny′−2i]。故枚举 y′y′ 和 ii 之后可以 O(1)O(1) 判断。
时间复杂度 O(ylogy)O(ylogy),空间复杂度 O(1)O(1)。
7.LOJ#6440. 万能欧几里得
为了避免重名,将原题中的 P,Q,R,LP,Q,R,L 在下文中均用小写字母表示。
万能欧几里得算法的思想是这样的:把问题抽象成,在坐标系上有一条直线 y=px+rqy=px+rq,我们在坐标系上画出所有 x=k,y=k,k∈Zx=k,y=k,k∈Z 的直线,现在有两种可合并的操作 U,RU,R,我们从左往右扫这条直线,遇到横线就执行 UU 操作,遇到竖线就执行 RR 操作,两者同时遇到先执行 UU 操作再执行 RR 操作,求做完这个操作序列之后得到的答案。直线的定义域是 (0,l](0,l]。
比如说这题,我们可以维护一个三元组 (a,b,ans)(a,b,ans),表示一段由 U,RU,R 组成的序列执行完后,Ax=aAx=a,B⌊px+rq⌋=bB⌊px+rq⌋=b,答案矩阵为 ansans。现在假设有两个操作序列分别对应三元组 (a1,b1,ans1)(a1,b1,ans1) 和 (a2,b2,ans2)(a2,b2,ans2),则把两个操作序列拼起来后得到的三元组为 (a1a2,b1b2,ans1+a1ans2b1)(a1a2,b1b2,ans1+a1ans2b1)。令 II 为单位矩阵,OO 为全 00 矩阵,于是 UU 操作对应的三元组为 (I,B,O)(I,B,O),RR 操作对应的三元组为 (A,I,A)(A,I,A)。令 f(p,q,r,l,U,R)f(p,q,r,l,U,R) 为上述问题的答案,为了方便我们要时刻保持直线在 x=0x=0 处的值在 [0,1)[0,1) 间,即 0≤r<q0≤r<q。同时还有一个性质,f(p,q,r,l,U,R)f(p,q,r,l,U,R) 对应的操作序列一定以 RR 结尾。
由于定义域的左端点是开区间,所以我们要先特殊处理一下一开始 r≥qr≥q 的情况,此时相当于先执行了 ⌊rq⌋⌊rq⌋ 次 RR 操作。
如果 l=0l=0,答案显然为 (I,I,O)(I,I,O)。
如果 p≥qp≥q,则每个 RR 之前至少有 ⌊pq⌋⌊pq⌋ 个 UU,把每个 RR 和它前面的 ⌊pq⌋⌊pq⌋ 个 UU 捆绑在一起,即 f(pmodq,q,r,l,U,U⌊pq⌋R)f(pmodq,q,r,l,U,U⌊pq⌋R)。
如果 p<qp<q,若此时 UU 的数量为 00 则把所有 RR 用快速幂一起处理,否则考虑翻转坐标系。先考虑一个简单的问题:第 aa 个 RR 前有几个 UU?由于直线在 x=0x=0 处的值在 [0,1)[0,1) 间,所以答案就是 RR 的横坐标,即 ⌊pa+rq⌋⌊pa+rq⌋。再考虑一个问题:第 aa 个 UU 前有几个 RR?设有 bb 个,则一定满足 ⌊p(b−1)+rq⌋≤a−1⌊p(b−1)+rq⌋≤a−1,⌊pb+rq⌋≥a⌊pb+rq⌋≥a,解得 ⌊qa−r−1p⌋≤b<⌊qa−r−1p⌋+1⌊qa−r−1p⌋≤b<⌊qa−r−1p⌋+1,因此 b=⌊qa−r−1p⌋b=⌊qa−r−1p⌋。那么我们新的问题大致就形如,在坐标系上有一条直线 y=qx−r−1py=qx−r−1p,从左往右扫这条直线,遇到横线就执行 RR 操作,遇到竖线就执行 UU 操作,两者同时遇到先执行 RR 操作再执行 UU 操作,求做完这个操作序列之后得到的答案。
再考虑一些细节上的问题,一个问题是我们要保证新直线的 r,qr,q 满足 0≤r<q0≤r<q,另一个问题是新的操作序列要以 UU 结尾。对于前者,我们先把第一个 UU 前的所有 RR 和第一个 UU 单独处理,把整条直线向左平移一格,新直线的解析式就变成了 y=qx+q−r−1py=qx+q−r−1p。由于定义域的左端点是开区间,所以将新直线的 rr 增大或减小 pp 的倍数都不影响得到的操作序列,所以可以把 q−r−1q−r−1 对 pp 取模,完整写出来就是 f(q,p,(q−r−1)modp,⌊pl+rq⌋−1,R,U)f(q,p,(q−r−1)modp,⌊pl+rq⌋−1,R,U)。对于后者,我们将原操作序列中最后一个 UU 后的 RR 一起处理即可。
如果认为 P,Q,R,LP,Q,R,L 同阶,则时间复杂度为 O(n3log2P)O(n3log2P),空间复杂度 O(n2)O(n2)。
8.CF1091G New Year and the Factorisation Collaboration
交互库提供的内容中只有 sqrt 比较难自己计算。
我们考虑随机一个 xx,满足 xx 与 nn 互质,并询问 sqrt x2modnx2modn。假设返回了 x′x′,那么我们知道 x2≡x′2(modn)x2≡x′2(modn),即 (x−x′)(x+x′)≡0(modn)(x−x′)(x+x′)≡0(modn)。
对于 nn 的每个质因子 pp,也都有 (x−x′)(x+x′)≡0(modp)(x−x′)(x+x′)≡0(modp)。由于 x≢0(modp)x≢0(modp),因此 gcd(x−x′,x+x′)=gcd(2x,x+x′)gcd(x−x′,x+x′)=gcd(2x,x+x′) 是 2x2x 的因数进而不是 pp 的倍数,所以 x−x′≡0(modp)x−x′≡0(modp) 和 x+x′≡0(modp)x+x′≡0(modp) 两者仅有一个成立。由于 xx 是随机的,所以两者成立的概率是相等的,都为 1212。
于是可以把 nn 划分成两部分,gcd(n,x−x′)gcd(n,x−x′) 和 gcd(n,x+x′)gcd(n,x+x′),每个质因子只在恰好一者中出现且出现概率均为 1212。可以看出,随机足够多次数后,就可以通过最终的划分确定 nn 的质因子了。
9.CF1270I Xor on Figures
设一次操作 (X,Y,W)(X,Y,W) 表示把 1≤i≤t1≤i≤t,a(xi+X)mod2k,(yi+Y)mod2ka(xi+X)mod2k,(yi+Y)mod2k 的位置都异或上 WW。我们可以把 X,YX,Y 完全相同的操作先合并起来,于是每个位置最多被操作一次。令 Wi,jWi,j 表示 X=i,Y=jX=i,Y=j 的操作中 WW 的值(没操作过视为 00),我们希望矩阵 WW 中非 00 的位置尽量少。
定义矩阵 FF,满足 FF 中有且仅有 Fxi,yi=1Fxi,yi=1。重新定义两个 2k×2k2k×2k 的矩阵 A,BA,B 的乘法,满足 (A×B)x,y=⨁2k−1i=0⨁2k−1j=0Ai,jB(x−i)mod2k,(y−j)mod2k(A×B)x,y=⨁2k−1i=0⨁2k−1j=0Ai,jB(x−i)mod2k,(y−j)mod2k,其中 ⨁⨁ 表示异或。于是有,FW=AFW=A(AA 是题中给定的矩阵)。
下面说明,可能的 WW 有且仅有一种。
首先要说明,F2k=IF2k=I,其中 Ii,j=[i=0∨j=0]Ii,j=[i=0∨j=0]。考虑 F2F2,发现只有 F22ximod2k,2yimod2kF22ximod2k,2yimod2k 这些位置可能有值,而形如 F2xi+xjmod2k,yi+yjmod2kF2xi+xjmod2k,yi+yjmod2k 的位置会被 Fxi,yiFxj,yjFxi,yiFxj,yj 和 Fxj,yjFxi,yiFxj,yjFxi,yi 异或两次抵消掉了。归纳可得,在 F2kF2k 中,只有 F2k2kximod2k,2kyimod2kF2k2kximod2k,2kyimod2k 这些位置可能有值,即只有 F2k0,0F2k0,0 可能有值。由于 FF 中原先有奇数个 11 且 FF 是 0101 矩阵,所以 F0,0=1F0,0=1。
因此 FW=AFW=A 等价于 F2k−1FW=F2k−1AF2k−1FW=F2k−1A,即 W=F2k−1AW=F2k−1A,故 WW 存在且唯一。
关于如何快速求解 WW,注意到 W=∏k−1i=0F2iAW=∏k−1i=0F2iA,而任意 F2iF2i 中都至多有 tt 个位置不为 00,因此单次矩阵乘法的复杂度为 O(t2k)O(t2k),总共要做 O(k)O(k) 次矩阵乘法。
时间复杂度 O(kt2k)O(kt2k),空间复杂度 O(2k)O(2k)。
10.SP20174 DIVCNT3 - Counting Divisors (cube)
前置知识:Powerful Number 筛。
下文对于函数名为小写字母的函数,用函数名为对应的大写字母的函数表示其前缀和。
令 d(i)=σ0(i)d(i)=σ0(i),f(i)=d(i3)f(i)=d(i3),那么我们要求的就是 F(n)F(n)。
尝试构造积性函数 gg 使得对于任意质数 pp 都有 g(p)=f(p)g(p)=f(p)。注意到 f(p)=4,d(1)=1,d(p)=2f(p)=4,d(1)=1,d(p)=2,所以 g=d∗dg=d∗d 是一个合法的构造(此时 g(p)=d(1)d(p)+d(p)d(1)=4g(p)=d(1)d(p)+d(p)d(1)=4)。
现在要再构造一个积性函数 hh 使得 f=h∗gf=h∗g,并且我们只需要预处理出 hh 在质数的幂处的取值,这可以由 f,gf,g 在质数的幂处的取值推来。注意到 h(pk)h(pk) 只和 kk 有关,而和 pp 无关,所以我们只用求出 O(logn)O(logn) 项 hh,时间复杂度 O(log2n)O(log2n),可忽略不计。
现在我们用 dfs O(√n)O(√n) 枚举所有 Powerful Number 并顺带计算出它的 hh,对于 Powerful Number xx,我们只需算出 G(⌊nx⌋)G(⌊nx⌋)。
G(n)=∑ni=1g(i)=∑ni=1∑j|id(j)d(ij)=∑nj=1d(j)∑⌊nj⌋i=1d(i)=∑nj=1d(j)D(⌊nj⌋)G(n)=∑ni=1g(i)=∑ni=1∑j|id(j)d(ij)=∑nj=1d(j)∑⌊nj⌋i=1d(i)=∑nj=1d(j)D(⌊nj⌋)。
D(n)=∑ni=1d(i)=∑ni=1∑j|i1=∑nj=1∑⌊nj⌋i=11=∑nj=1⌊nj⌋D(n)=∑ni=1d(i)=∑ni=1∑j|i1=∑nj=1∑⌊nj⌋i=11=∑nj=1⌊nj⌋。
为了快速计算 G,DG,D,我们可以使用数论分块,并且此时会用到的 G,DG,D 的值一定形如 G(⌊nx⌋),H(⌊nx⌋)G(⌊nx⌋),H(⌊nx⌋) 的形式。用线性筛预处理出前 O(n23)O(n23) 的 G,DG,D 的值后再记忆化搜索即可达到 O(n23)O(n23) 的复杂度。
总时间复杂度 O(n23)O(n23),空间复杂度 O(√n)O(√n)。
11.CF1656H Equal LCM Subsets
如果 A(B)A(B) 中存在一个数,它的某个质因子指数比 B(A)B(A) 中所有数该质因子指数都大,那这个数就一定要删掉。
如果不存在这样的数了,要么是有集合被删空了,此时无解;否则,此时两集合的 lcmlcm 相同。
为了快速找到 AA 中是否存在这样的数,我们要找到是否有 ai∈Aai∈A,不满足 ai|lcmbj∈B{bj}ai|lcmbj∈B{bj}(BB 中是对称的)。而 ai|lcmbj∈B{bj}⇔lcmbj∈B{gcd(bj,ai)}=ai⇔gcdbj∈B{aigcd(bj,ai)}=1ai|lcmbj∈B{bj}⇔lcmbj∈B{gcd(bj,ai)}=ai⇔gcdbj∈B{aigcd(bj,ai)}=1(因为三者都等价于对于任意质数 pp,maxbj∈B{vp(bj)}≥vp(ai)maxbj∈B{vp(bj)}≥vp(ai))。因此可以开 nn 棵线段树来维护所有 aigcd(bj,ai)aigcd(bj,ai) 的 gcdgcd,删掉 bjbj 就相当于在 nn 棵线段树上单点修改 bjbj 为 11。
如果认为 n,mn,m 同阶,a,ba,b 同阶,则时间复杂度 O(n2(logn+loga))O(n2(logn+loga)),空间复杂度 O(n2)O(n2)。
12.CF1566H Xor-quiz
首先我们只用问 [1,c][1,c] 中 μ≠0μ≠0 的数,在题目范围内这些数的数量级是不超过 ⌈0.65c⌉⌈0.65c⌉ 的,也就是说我们可以获得全部信息。
现在对任意满足其所有质因子出现次数都为 11 的 kk,都知道了与 kk 互质的数的异或和,通过反演可以求出所有不同质因子的乘积恰为 kk 的数的异或和。
也就是说现在有若干集合,要求每个集合内选一些数使得它们的异或和等于某个给定值,且所有集合内选的数的个数总和为 nn。建出每个集合内的线性基,因为有解所以每个集合的给定值一定可以被该集合的线性基表出。对于一个大小为 xx 的集合,假设建出了大小为 yy 的线性基,则有 x−yx−y 个集合内的数不在线性基中(有 x−yx−y 个自由元)。所以为了异或出给定的数我们要现在自由元中选出一个子集,并将该子集通过线性基内的数异或成给定的数,可以发现恰有 2x−y2x−y 种方案。
打表可以发现,在 c=106c=106 时最大的集合为 210210 对应的集合,其中有 260260 个数,所以在自由元中枚举每个子集是不现实的,由于数据随机,我们考虑在自由元中随机一些子集。还可以发现,没有自由元的集合只有唯一一种选法,因此可以忽略,打表可知有自由元的集合的大小总和在 c=106c=106 时为 6887368873,这说明了每个集合内能选出的最大合法子集的大小减最小合法子集的大小不会太大。那么在随完子集后用 bitset 优化 dp 即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端