(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. Spring的AOP源码解析(二)

    Spring AOP 源码解析 目录 Spring AOP 源码解析 前言 本文使用的调试代码 IOC 容器管理 AOP 实例 ProxyFactory 详解 基于注解的 Spring AOP 源码分 ...

  2. P9033题解

    P9033「KDOI-04」XOR Sum 题解 题目链接 传送门 题意简述 构造一个长度为 \(n\),值域为 \([0,m]\) 的异或和为 \(k\) 的序列,如果不存在则输出 \(-1\). ...

  3. appium:报错Message: Message: Parameters were incorrect. We wanted {"required":["value"]}

    python版本3.7.4,selenium版本4.0.0,Appium-Python-Client版本2.0.0,报错见标题 别人给出的建议:https://blog.csdn.net/liangs ...

  4. 升级sqlite3

    原文连接: https://blog.zhheo.com/p/22f4cbb2.html 创建一个工作目录(可选) Code 12 mkdir sqlite3_upgradecd sqlite3_up ...

  5. 解决iview拖动头部横向滚动问题

    Vue.directive('dragsroll', { bind (my_el) { let elHeader = my_el.querySelector('div.ivu-table-header ...

  6. Java编写1到100质数之和

    int sum = 0; int k = 2; // 找出1-100的质数之和 for (int i = 2; i <= 100; i++) { // i值为2,质数为除去1和自身整除的数 j初 ...

  7. C# 窗口全屏、置顶、获取焦点

    很简单的几行代码 this.FormBorderStyle = FormBorderStyle.None; //设置窗体为无边框样式 this.WindowState = FormWindowStat ...

  8. 【电路理论】Flyback dc-dc convertor 反激式dc-dc变换器

    最近在学dc-dc电源时,遇到Flyback电路的,感觉云里雾里,不太明白,四处翻阅,方才有所理解,记录一下 一般Flyback convertor的拓扑如下 认为,当VT导通时,原边变压器储能,由于 ...

  9. 导出SQL SERVER 数据字典语句

    --use YourDatabase --指定要生成数据字典的数据库go SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=c ...

  10. Java基础学习:4、类和对象及方法

    类:事物的描述.是具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象. 对象:该类事物的实例.在Java中通过new进行创建.是一个真实世界中的实体.对象是一种个性的 ...