考虑在 \(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. RMI反序列化分析

    RMI介绍 RMI全程Remote Method Invocation (远程方法引用),RMI有客户端和服务端,还有一个注册中心,在java中客户端可以通过RMI调用服务端的方法,流程图如下: 服务 ...

  2. KingbaseES 最老事务阻止vacuum freeze

    前言 最近生产环境发生几次由于长事务导致表.库年龄没法回收的情况.我们要规避这种情况的发生,不要等发生了再去强制中断会话连接.当数据库中存在最老事务版本xmin,那么早于他的快照可以被标记为froze ...

  3. C++类型双关

    Σ(っ °Д °;)っ #include<iostream> struct Entity { int x, y; int* GetPtr() { return &x; } /*En ...

  4. ssh登录太慢了,每次都要20s

    背景 大家工作时,少不了ssh登录各个服务器,我这边手里也有很多服务器,有一些登录很快就进去了,有些要卡半天才能进去.之前以为是公司网络问题,每次也就忍了,这次突然不想忍了,决定定位一下. 我这边的服 ...

  5. 5 JavaScript变量提升

    5 变量提升 看以下代码, 或多或少会有些问题的. function fn(){ console.log(name); var name = '大马猴'; } fn() 发现问题了么. 这么写代码, ...

  6. #最大流#WOJ 124 Football Coach

    题目 有\(n\)支球队,互相之间已经进行了一些比赛.现在还有\(m\)场比赛未进行, 每场比赛胜者得2分,平局各得1分,负者不得分. 问是否存在一种方法使得球队\(n\)的得分比其他\(n-1\)支 ...

  7. #模拟#洛谷 2327 [SCOI2005]扫雷

    题目 分析 考虑最多只有两种情况,因为确定一个位置其它位置随即也能确定, 那么指定第一个位置有没有雷然后判断一下后面推出的雷数是否为0或1,不是显然不行 代码 #include <cstdio& ...

  8. Regex中Replace方法的简单实用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. Dev 控件 gridControl教程

    Dev 控件 gridControl教程:https://www.bilibili.com/video/BV1gz4y1R7Wk/?spm_id_from=333.788.recommend_more ...

  10. 将py文件编译成pyc

    核心代码 import compileall compileall.compile_file("a.py", legacy=True, force=True) 演示步骤 1.新建 ...