loj6851
(CF1761D Tester Solution in Chinese)
定义 \(L(v)=\log_2\operatorname{lowbit}(v+1)\);也就是说,\(L(v)\) 是 \(v\) 在二进制下末位 \(1\) 的个数。
例如,\(L((1011)_2)=2,L((11100100111)_2)=3\)。
然后定义
\[C(n,k,l)=\sum_{i=0}^{2^n−1}\sum_{j=0}^{2^n−1}[f(i,j)=k,L(i+j)=l]
\]
则,答案可以被描述为
\[S(n,k)=\sum_{l=0}^nC(n,k,l)
\]
考虑对其做递推。
通过对 \(i,j\) 末位做分类讨论,容易得到
\[C(n,k,l)=\begin{cases}1&n=0\\2C(n-1,k,l-1)&l>0\\\sum_pC(n-1,k,p)+\sum_pC(n-1,k-p-1,p)&\text{otherwise.}\end{cases}
\]
而这立刻给出
\[C(n,k,l)=\begin{cases}1&n=0\\2^lC(n-l,k,0)&l>0\\\sum_p2^pC(n-p-1,k,0)+\sum_p2^pC(n-p-1,k-p-1,0)&\text{otherwise.}\end{cases}
\]
\[Ans_{n,k}=\sum_{l=0}^n2^lC(n-l,k,0)
\]
也就是说,我们只用去研究 \(C(n,k,0)\),就可以获得答案了!
于是对其,我们定义一个 BGF(二元生成函数)
\[F(z,u)=\sum_n\sum_kC(n,k,0)z^nu^k
\]
然后就得到
\[F=1+F\times\sum_p\left(2^pz^{p+1}+2^pz^{p+1}u^{p+1}\right)
\]
\[F=1+F\times(\frac z{1-2z}+\frac{zu}{1-2zu})
\]
\[F=\frac1{1-(\frac z{1-2z}+\frac{zu}{1-2zu})}
\]
\[F=\frac{(1-2z)(1-2zu)}{1-3z-3zu+8z^2u}
\]
这样,我们的答案就是
\[S(n,k)=[z^nu^k]\frac F{1-2z}=[z^nu^k]\frac{1-2zu}{1-3z-3zu+8z^2u}
\]
考虑如何计算 \(S(n,k)\)。
\[S(n,k)=[z^nu^k]\frac{1-2zu}{1-3z-3zu+8z^2u}\\=[z^nu^k]\frac1{1-3z-3zu+8z^2u}-2[z^{n-1}u^{k-1}]\frac1{1-3z-3zu+8z^2u}
\]
这两部分是类似的,现在我们就考虑第一部分(为了减少手算量)。我们仅仅观察第一部分好了。
不妨称之为 \(A_n\)。
\[A_n=[z^nu^k]\frac1{1-3z-3zu+8z^2u}=[z^{n-k}]\frac{(3-8z)^k}{(1-3z)^{k+1}}
\]
考虑使用 ODE 来计算所有 \(A_n\)。
设
\[G(z)=\frac{(3-8z)^k}{(1-3z)^{k+1}}
\]
\[G_t=[z^t]G
\]
则
\[G'=\frac{-8k(3-8z)^{k-1}(1-3z)+3(k+1)(3-8z)^k}{(1-3z)^{k+2}}
\]
于是
\[(1-3z)(3-8z)G'=\frac{-8k(3-8z)^k(1-3z)+3(k+1)(3-8z)^{k+1}}{(1-3z)^{k+1}}\\=(-8k(1-3z)+3(k+1)(3-8z))G
\]
即
\[(3-17z+24z^2)G'=(k+9-24z)G
\]
\[3(t+1)G_{t+1}-17tG_t+24(t-1)G_{t-1}=(k+9)G_t-24G_{t-1}
\]
从而
\[G_{t+1}=\frac{(9+17t+k)G_t-24tG_{t-1}}{3(t+1)}
\]
考虑边界,也就是
\[G_0=3^k,G_1=3^{k-1}(9+k)
\]
于是我们就可以在 \(O(n)\) 时间内计算出数列 \(G\) 了。
事实上,如果模数为 \(998244353\),我们还可以用整式递推在 \(O(\sqrt n\log n)\) 时间内求出单项 \(S(n,k)\)。
参考代码。
本文来自博客园,作者:myee,转载请注明原文链接:https://www.cnblogs.com/myee/p/loj6851.html

浙公网安备 33010602011771号