CF623E Transforming Sequence 做题记录

对于一个整数序列 {a1,a2,,an}\{a_1, a_2, \ldots, a_n\},我们定义它的变换为 {b1,b2,,bn}\{b_1, b_2, \ldots, b_n\},其中 bi=a1a2aib_i = a_1 | a_2 | \ldots | a_i,其中 | 表示二进制按位或运算。

现在求有多少个长为 nn 的序列 aa,满足 1ai2k11\leq a_i \leq 2^k - 1,使得它的变换 bb严格单调递增的,对 109+710^9+7 取模。

1n10181\leq n \leq 10^{18}1k3×1041\leq k \leq 3 \times 10^4

我们设 dpi,j,0/1dp_{i,j,0/1} 表示序列有 ii 个数,当前或和第 jj 位(二进制)是 0/10/1 的方案数

好难转移啊/ll

如果设 dpi,jdp_{i,j} 表示序列有 ii 个数,当前或和为 jj 的方案数呢?

那么我们可以枚举 jj 的二进制中 11 的个数来转移!

所以说正确的状态应该是 dpi,jdp_{i,j} 表示序列有 ii 个数,当前或和二进制有 jj11

推一下柿子:

dpi,j=l=0j(jl)dpi1,l2ldp_{i,j}=\sum\limits_{l=0}^j\dbinom{j}{l}dp_{i-1,l}2^l

这个柿子的意思是,枚举前 i1i-1 项的或和有多少个 11 和这些 11 在哪里,然后第 ii 项的剩下 jlj-l11 的位置必须是 11,但是 ll11 的位置可以是 00 也可以是 11

拆组合数:

dpi,j=j!l=0jdpi1,l2ll!1(jl)!dp_{i,j}=j!\sum\limits_{l=0}^j\dfrac{dp_{i-1,l}2^l}{l!}\dfrac{1}{(j-l)!}

考虑换一种转移方式,有:

dpa+b,j=l=0j(jl)dpa,ldpb,jl2bldp_{a+b,j}=\sum\limits_{l=0}^j \dbinom{j}{l}dp_{a,l}dp_{b,j-l}2^{bl}

这个柿子的意思是,枚举前 aa 项的或和有多少个 11 和这些 11 在哪里,然后剩下 bb 项补足前 aa 项没有的 11,并且这 bb 项的被前 aa 项占用的那些位置可以填 0/10/1

然后拆一下组合数:

dpa+b,j=j!l=0j2bldpa,ll!dpb,jl(jl)!dp_{a+b,j}=j!\sum\limits_{l=0}^j\dfrac{2^{bl}dp_{a,l}}{l!}\dfrac{dp_{b,j-l}}{(j-l)!}

也就是说,我们可以这样倍增转移:

{dpn,i=i!j=0idpn1,j2jj!1(ij)!dp2n,i=i!j=0i2njdpn,jj!dpn,ij(ij)!\begin{cases}dp_{n,i}=i!\sum\limits_{j=0}^i\dfrac{dp_{n-1,j}2^j}{j!}\dfrac{1}{(i-j)!}\\dp_{2n,i}=i!\sum\limits_{j=0}^i\dfrac{2^{nj}dp_{n,j}}{j!}\dfrac{dp_{n,i-j}}{(i-j)!}\end{cases}

好了,用 MTT 优化就行。