考虑在 \(n\) 个节点的树中,树根作为 \(lca\) 对答案的贡献,显然就是在左子树的叶子中选出一个非空集的方案乘上右子树的方案。

\[w(n, id) = id \cdot (2 ^ {L\_Leaf} - 1) \cdot (2 ^ {R\_Leaf} - 1)
\]

进而得到一个 \(O(N)\) 的 \(dp\),其中 \(ls = \lceil \dfrac{n}{2} \rceil\),\(rs = \lfloor \dfrac{n}{2} \rfloor\)。

\[dp(n, id) = w(n, id) + dp(ls, 2\cdot id) + dp(rs, 2\cdot id + 1)
\]

观察状态参数,可以发现在一次求解中 \(id\) 有 \(O(N)\) 个,而 \(n\) 只有 \(O(\log N)\) 个,一个直观的想法是把 \(id\) 从状态方程中剥离出去。

不妨手玩一下这个式子。

\[\begin{aligned}
dp(n, id) &= w(n, id) + dp(ls, 2\cdot id) + dp(rs, 2\cdot id + 1) \\
&= t(n) \cdot id + dp(ls, 2\cdot id) + dp(rs, 2\cdot id + 1) \\
&= t(n) \cdot id + t(ls) \cdot 2\cdot id + t(rs) \cdot (2\cdot id + 1) + (dp \ldots) \\
&= (t(n) + 2 \cdot t(ls) + 2 \cdot t(rs) + 4 \cdot \ldots) \cdot id + (t(rs) + \ldots)
\end{aligned}
\]

能够得到整个状态方程为 \(id\) 的一次函数,只需维护 \(k(n)\) 和 \(b(n)\) 就好了。

\[dp(n, id) = k(n) \cdot id + b(n)
\]

由于

\[\begin{aligned}
dp(n, id) &= t(n) \cdot id + dp(ls, 2\cdot id) + dp(rs, 2\cdot id + 1) \\
&= t(n) \cdot id + k(ls) \cdot 2\cdot id + b(ls) + k(rs) \cdot (2\cdot id + 1) + b(rd)
\end{aligned}
\]

所以

\[k(n) = t(n) + 2 \cdot k(ls) + 2 \cdot k(rs)
\]
\[b(n) = b(ls) + k(rs) + b(rs)
\]
map<ll, pll> mp;

pll calc(ll n) {
if(mp.find(n) != mp.end()) return mp[n];
auto [lk, lb] = calc((n + 1) / 2);
auto [rk, rb] = calc(n / 2);
ll t = (q_pow(2, (n + 1) / 2) - 1) * (q_pow(2, n / 2) - 1) % P;
ll k = (t + 2 * lk + 2 * rk) % P;
ll b = (lb + rk + rb) % P;
/*
f[n][id] = t * id + f[ls][lsid] + f[rs][rsid]
*/
return mp[n] = {k % P, b % P};
} void solve() {
ll n;
cin >> n;
auto [k, b] = calc(n);
cout << (k + b) % P << '\n';
} int main() {
int T; cin >> T;
mp[1] = {1, 0};
while(T --) solve();
return 0;
}

ccf 赶紧支持 c++17

随机推荐

  1. C# OpenCvSharp-HoughCircles(霍夫圆检测) 简单计数

    效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...

  2. management.endpoints.web.exposure.include

    yml配置文件中 management: endpoints: web: exposure: include: '*' properties配置文件中 management.endpoints.web ...

  3. MySQL备份还原工具

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. wire和reg型变量的组合使用

    模型功能 实现寄存器之间的连线 实现寄存器的声明 建构时钟的时序系统 模型框图 `timescale 1ns / 1ps /* */ // ****************************** ...

  5. 搭建Spring Cloud父工程

    1.首先创建一个maven项目 删除src目录,当做一级目录用来管理第三方jar版本控制. 2.配置pom文件. SpringCloud.SpringCloudAlibaba.SpringBoot版本 ...

  6. KingbaseES V8R6集群部署案例之---openEuler系统脚本部署故障

    案例说明: 在openEuler系统下通过脚本方式部署KingbaseES V8R6集群,脚本执行过程中,加载vip失败.本次故障问题,主要是因为openEuler系统shell和脚本的不兼容引起. ...

  7. 巧用dblink 实现多进程并行查询

    概述 对于分区表的大数据统计分析,由于数据量巨大,往往需要采用并行.但是数据库并行的效率相比分进程分表统计还是有比较大的差距.本文通过巧用dblink,实现分进程分分区统计数据. 例子 kingbas ...

  8. Log4Net使用示例

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...

  9. Mac 使用 Nginx 在本地部署静态网站

    安装 安装 Brew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/i ...

  10. 直播预告丨 OpenHarmony 标准系统多媒体子系统之相机解读

    5 月 26日(周四)晚上 19 点,OpenHarmony 开源开发者成长计划知识赋能第五期"掌握 OpenHarmony 多媒体的框架原理"的第六节直播课,即将开播! 深开鸿资 ...