醉里挑灯看太阳神

《NOI Online 2021 提高组 愤怒的小 N》

虽然可以看出 b 就是 bitcount 为奇数的数,但我们不用想这么多。

一个集合 SEGFFS(x)=jSexp(jx),因为此时 [xkk!]FS(x)=jSjk 。包括我们所熟悉的,求 jS(j+δ)k,维护 jSjt(0tk) 可求,本质上就是 exp(δx)FS(x) 罢了。

闲话多说了些。接下来直接开搞。记 An(x)[0,n)2bitcount 的数的集合的 EGF,也就是 a 的那些关卡;同理可记 Bn(x) 。根据题目直接有

{A2n+1(x)=A2n(x)+exp(2nx)B2n(x)B2n+1(x)=B2n(x)+exp(2nx)A2n(x)

我们讨厌 “换手搓背”,我们希望独立递推,也许进而可知通解——矩阵对角化。

(1e2nxe2nx1)=(1111)(1+e2nx001e2nx)(12121212)

也就是

{A2n+1(x)+B2n+1(x)=(1+exp(2nx))(A2n(x)+B2n(x))A2n+1(x)B2n+1(x)=(1exp(2nx))(A2n(x)B2n(x))

前者就不说了,根据定义 An(x)+Bn(x)=i=0n1exp(ix),即自然数幂和的 EGF,直接用等比数列公式化简即可。而初值 A1(x)=1,B1(x)=0 使我们知道

A2n(x)B2n(x)=i=0n1(1exp(2ix))

这看上去挺丑陋,且需要暴力多项式乘法。正当无奈之时,忽然发见 1exp(2ix) 没有常数项!这说明 nk+2 时,在我们所需的 mod xk 范围内 A2n(x)B2n(x)=0 。意外之喜。

再根据 “整体加是乘法”,可见 2k+2nBn(x)An(x)+Bn(x)2,而右式是已经解决的问题。因此,我们只需要解决 2k+2n2k+2n 这一小部分关卡的答案。这个问题近似于 0nmod2k+2 的问题,只不过最后要乘一个 exp(2k+2n2k+2x) 罢了。

用最普通的方法:枚举 lcp,剩余部分是 A2l(x),B2l(x) 。预处理 l[0,k] 。乘法暴力做,复杂度 O(k3+logn)代码就去看兔兔的咯


《HDU6593 Coefficient》

可以换元 g(x)=1bf(x+x0)=1c+exp(ax),因此我们就假定 b=1,d=x0=0 吧。

根据 f(x)=aexp(ax)(c+exp(ax))2,可以想到接下来的形式必然是 fjexp(jax)(c+exp(ax))j+1 。系数的变化规律是

derivative's fj=ja(fjfj1)

a 是统一的,可忽略之,最后答案乘 an 。初值 f0=1 。最后的答案就是 1n!j0fj(c+1)j+1

考虑系数的 “移动”(因为是线性变换),可见路径权值是 (1)ki=1kiqi,其中 qi0qi=n,贡献到 fk 。这就可以用 OGF 轻易描述了:

fk=[xn](1)kj=1kjx1jx

我不熟悉它,所以我没能指出:j=1kx1jx第二类斯特林数 在第 k 列上的 OGF 。其实想想 i=1kiqi 不就是每次要么放进新盒子、要么放进已有的盒子,第二类斯特林数吗!

“你看到的只是表象。” —— 太阳神 Tiw-Air-OAO

因此 fk=k!(1)k{nk} 即得。用斯特林数在第 n 行上的 OGF 去算即可。

再或者,我们可以换一种刺杀的方式。直接从生成函数的角度考虑它,答案就是

[xn]1c+exp(ax)

吸取 “Binomial Sum” 的经验,只需把 F(x)=11+c+x 展开成

F(x)=(c+1)1i=0n(1)i(c+1)i

我们先算出

[xn](eax1)t=i=0t(ti)(1)ti(ai)n

Remark:把 a 去掉后,其实 1t!(ex1)t 就是第二类斯特林数在第 t 列上的 EGF 。因此我们得到的也就是第二类斯特林数在第 n 行上的 OGF

直接得到

ans=an[(c+1)1t=0n(c+1)ti=0t(ti)(1)iin]

系数 i=0t(ti)(1)iin 是简单卷积,然后对 q(c+1)1 多点求值。复杂度 O(nlogn+qlog2n)


《HDU6355 fireflies》

转最长反链。然后就没辙了。事实上,对于任意多重集 S,设第 i(1in) 种元素有 ai 个。我们有

引理:存在对 S 进行 “对称链分解” 的方式,使得 S 的每个子集在恰好一条链中出现。

我们称子集链 T1T2Tk 是对称链,当且仅当 |Ti|+1=|Ti+1||T1|+|Tk|=ai 。注意 k 可能为 1,此时 |T1|=a2(2a)

证明:归纳构造。两个我不喜欢的名词n=0T1= 是一条链。然后每次加入 a 个元素 x,对于原本的对称链 T1T2Tk,可将其变为 min{a+1,k} 条对称链

{T1TkTk+{1×x}Tk+{a×x}T1+{1×x}Tk1+{1×x}Tk1+{2×x}Tk1+{a×x}T2+{1×x}Tk2+{2×x}Tk2+{3×x}Tk2+{a×x}T1+{a×x}T2+{a×x}Tka+{a×x}

我承认上面这一大坨有点吓人。可以画图来直观感受它。原本的链就是 Ti=(0,i),是 y 轴上的点,而现在 [0,a] 成为 x 轴可选值。这个划分方式就是,先从 (0,1) 开始,进行 “无脑搜索”——往上一直走,直到下一个点已走过,然后往右一直走。再从 (1,1),(2,1),,(min{a,k},1) 分别进行 “无脑搜索”。

不难验证其仍为对称链。

注意到,大小为 M=ai2 的子集在每个对称链里都出现了恰好一次。因此,这样的集合的数量就是最长反链的长度(我们构造出了其对应的链覆盖)。

剩下的部分就是折半、容斥。重点其实在于 Lemma

iSjTαiβj(Mij+n1n1)=t=0n1iSαi(Mit)jTβj(n1jn1t)


《IOI2021 集训队互测 子集匹配》:设 U={1,2,3,,n},记 Fk={S|SU,|S|=k} 。若 TFk1,SFk 满足 TS 则二者之间连边。请构造大小为 |Fk| 的匹配。保证 2n2k>n

用对称链构造即可。具体实现我不会,很尴尬。


《WC2021 斐波那契》

F(x)=(x+x2)F(x)+a+(ba)x

因此,记 fn=[xn]11xx2,也就是第 n 个斐波那契数(f0=f1=1),则题目等价于

afn+(ba)fn10(modm)

不妨换元为

afn1bfn(modm)

考虑 分离变量,即把 fn1,fn 放到一边去。为实现之,我们需要互质性。因此可以同时给 a,b,m 除以 gcd(a,b,m) 得到

afn1bfn(modm)

gcd(a,b)1 则两边同时除以 gcd(a,b)(该值与 m 互质,存在逆元),故假定 gcd(a,b)=1 。再结合最重要的 gcd(fn1,fn)=1,不难发现

gcd(fn1,m)=gcd(b,m)=gbgcd(fn,m)=gcd(a,m)=ga

于是等式两边和模数再同时除以 gagb

agafn1gbbgbfnga(modmga1gb1)

终于,每个数都与模数互质,可以移项。答案变为

fnga1fn1gb1aga1bgb1(modmga1gb1)

引理:斐波那契数列的循环节长度是 O(m) 的,其中 m 是模数。

证明:由通项公式(或者说矩阵对角化),若 ϕ+=1+52ϕ=152 都出现循环节 ϕ+nϕn1(modm) 则原数列必循环。

2 取模时构成非纯循环,从 f1 开始有长度为 2 的循环节,不作过多考虑。

首先考虑对奇质数 p 取模。认为运算在 Zp(5) 下进行。

ϕ+p=12pi=0p(pi)5i=12(1+5p)=12(1+5p125)

同理 ϕp=12(15p125) 。若 5p12=1p 就是循环节;否则 5p12=1,有 ϕ+p=ϕ,ϕp=ϕ+ 说明

ϕ+2p+2=ϕ2ϕ+2=1

同理 ϕ2p+2=1,因此 (2p+2) 是一个循环节。

Lemma. 若 a1(modp)apk1(modpk+1)

Proof. 归纳法。前提条件已保证 k=0 时成立。然后对 k1

apk=(apk1)p=(1+tpk)p=i=0p(tpk)i(pi)1+(tpk)1(p1)1

上式中 i>1pkimodpk+1=0,因此可忽略。

然后考虑对 pk 取模。由 Lemma(ϕ±m)pk11(modpk),因此有循环节 mpk1,其中 m{2p+2,p} 为上文中 “对 p 取模” 的循环节。

最后对合数 m=piti 取模,至少有循环节 lcm{mi},而 mi{(2pi+2)piti1,piti},因此 lcm{mi}2(piti+piti1)=2m(1+pi1)=O(m)

Remark:这个值究竟是不是 O(m),存疑。

根据引理,我们可以暴力求解。把询问以三元组 (ga,gb,aga1bgb1) 形式放在 mga1gb1 的桶里,其中 ga=gcd(a,m),gb=gcd(b,m) 。最后,对每个 dm,以 d 为模数求斐波那契数列,查询是否有三元组满足 ga=gcd(fn,m),gb=gcd(fn1,m) 且第三个值为比值。

复杂度最多为 O(σ1(m)logm+qlogm),其中 σ1(m) 为约数和。

“这个算法当初是我自己独立提出的!(叉腰)” —— 傲娇 Tiw-Air-OAO


《AGC021F Trinity》

读者应该能从我的水平推断出:我连 dp 都没写出来。

要往 dp 的方向想,而不是直接 GF 。设 fm,nmn 行的答案,枚举最后一列进行转移。

fm,n=[(n0)+(n1)+(n2)]fm1,n+i=1n(n+2i+2)fm1,ni

前者是 Ajm 时,考虑该列的 (Bm,Cm) 数量。后者枚举了 Aj=m 的数量,根据 (Bm,Cm) 是否为其中一员,可知方案数为

(ni)+2(ni+1)+(ni+2)=(n+2i+2)

然后考虑卷积优化,记 Fm(x)=n0fm,nxnn!

Fm(x)=exFm1(x)+(2exx2)Fm1(x)+(exx1)Fm1(x)

立刻有 O(mnlogn) 做法。可是我们惊讶地发现,将 y=ex 看成新变元,则这是 O(m2) 大小的二元生成函数。因此最后得到 Fm(x)=i=0mj=0mcm,i,jxiexp(jx)O(m3) 的,与 n 无关!

最后答案为 i=0n(ni)fm,i=[xnn!]exFm(x) 。可以 O(m2) 提取系数。时间复杂度 O(m3)

posted @   OneInDark  阅读(100)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示