(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)\)。

参考代码

loj6851的更多相关文章

随机推荐

  1. call, apply,bind的区别与用法

     call, apply,bind的区别            相同点:都可以用来改变this指向           不同点:           call, apply:传参方式不同:       ...

  2. Oracle function函数中无法使用update更新

    CREATE OR REPLACE FUNCTION changePY RETURN VARCHAR2 as PRAGMA AUTONOMOUS_TRANSACTION; --as 或者 is 后边 ...

  3. Mysql昨天,上个月条件查询

    1.查询昨日数据 SELECT * FROM test WHERE DATEDIFF(DATE_FORMAT(NOW(),'%Y%m%d'),DATE_FORMAT(created_time,'%Y% ...

  4. web基础(3):CSS样式

    chapter4 CSS样式 html是网页的内容和结构:CSS是网页的样式.内容和样式相分离,便于修改样式. CSS cascading style sheets 层叠样式表.一个内容上面可以添加多 ...

  5. Blender中服装网格重新拓扑实录

    最近了解到游戏行业服装的一些处理流程.简单来说: 用MD等做衣服的软件,将服装做出来: 导出2种模型:缝合好的服装模型(叫它3d)以及没有变形的平铺板片模型(叫它2d),建议导出单层的,都要带着UV, ...

  6. ajv参数验证

    1.验证枚举类型 var schema = { "properties": { "data": { "type": "object ...

  7. [Docker-1自顶向下学习Docker

    本文目录: 什么是DOCKER? 什么是容器? 什么是DOCKER镜像? DOCKER有什么使用场景和优势? 流程图一:从中央仓库拉取镜像并部署 流程图二:上传镜像到中央私库 结语   什么是DOCK ...

  8. 南大ics-pa/PA0过程及感想

    实验教程地址:https://nju-projectn.github.io/ics-pa-gitbook/ics2022/index.html 一.Ubuntu安装 在清华大学镜像站下载了Ubuntu ...

  9. mybatis中xml新增一条数据获取自增id

    在insert的标签里加两个属性:useGeneratedKeys="true"         keyProperty="patentId"   ,这个key ...

  10. params的使用

    今天在写vue的JavaScript的时候有个地方需要传很多参数,自己写不出来,求助 我的博博 后拿到神奇代码: 神奇代码中有params,俺自作聪明,以为他是一个json的数据,所以自己改了个名字 ...