给定一棵带有n
节点的树(n
可以大到2 * 10^5
),其中每个节点都有一个与之相关的成本,让我们定义以下函数:
g(u, v) = the sum of all costs on the simple path from u to v
f(n) = the (n + 1)th Fibonacci number (n + 1 is not a typo)
我正在处理的问题需要我计算f(g(u, v))
树中所有可能的节点对的总和 modulo 10^9 + 7
。
例如,让我们以一棵带有3
节点的树为例。
- 不失一般性,假设节点
1
是根,它的子节点是2
和3
costs[1] = 2, cost[2] = 1, cost[3] = 1
g(1, 1) = 2; f(2) = 2
g(2, 2) = 1; f(1) = 1
g(3, 3) = 1; f(1) = 1
g(1, 2) = 3; f(3) = 3
g(2, 1) = 3; f(3) = 3
g(1, 3) = 3; f(3) = 3
g(3, 1) = 3; f(3) = 3
g(2, 3) = 4; f(4) = 5
g(3, 2) = 4; f(4) = 5
10^9 + 7
将所有值相加,并将结果取模26
作为正确答案。
我的尝试:
我实现了一种算法,通过使用稀疏表找到最低的共同祖先来g(u, v)
计算O(log n)
。
为了找到合适的斐波那契值,我尝试了两种方法,即在矩阵形式上使用幂运算,另一种方法是注意到序列modulo 10^9 + 7
是循环的。
现在是极其棘手的部分。无论我如何进行上述计算,O(n^2)
在计算所有可能的总和时,我最终还是会达到对f(g(u, v))
。我的意思是,只进行n * (n - 1) / 2
配对有明显的改进,但这仍然是二次的。
我错过了什么?我已经研究了几个小时,但是如果不实际产生二次算法,我看不到获得该总和的方法。