#P14911. [NHSPC 2024] 指紋

[NHSPC 2024] 指紋

题目描述

彼得是一個生物專家,他從不同的資料中分析同一群物種間的演化關係,經常會得到不同的演化樹,他想知道不同演化樹間的相似程度。為了節省比較時間,他的想法是先將每一棵演化樹 TT 的結構用一個稱為「指紋 (fingerprint)」的數字來表示,然後再進一步去仔細比較「指紋」相近的不同演化樹。

演化樹是一棵無向無根樹 (undirected, unrooted tree),葉節點代表現存物種。令 SS 是一個現存物種集合,令 TTSS 的一棵演化樹;也就是說 TT 的葉節點集合是 SS;令 deg(x)\text{deg}(x) 表示與節點 xx 相鄰之節點個數,對於一個點 xTx \in T,當 deg(x)=1\text{deg}(x) = 1 時,我們稱 xxTT 的葉節點;而不是葉節點的點就稱作為內節點,代表著物種的演化過程。對任兩個物種 x,ySx, y\in S,定義它們間的距離 d(x,y)d(x, y)xxyy 路徑 (path) 上的邊數 (number of edges)。彼得用 f(T)f(T) 來表示 TT 的「指紋」並定義 TT 的「指紋」為任兩物種距離平方的總和;也就是說

f(T)=x,yS,x<yd(x,y)2f(T) = \sum_{x, y \in S, x < y} d(x, y)^2。

以下圖中的演化樹 TT 為例,這個演化樹的「指紋」 $f(T) = d(1, 2)^2 + d(1, 3)^2 + d(1, 4)^2 + d(1, 5)^2 + d(2, 3)^2 + d(2, 4)^2 + d(2, 5)^2 + d(3, 4)^2 + d(3, 5)^2 + d(4, 5)^2 = 3^2 + 3^2 + 3^2 + 3^2 + 4^2 + 4^2 + 2^2 + 2^2 + 4^2 + 4^2 = 108$。

:::align{center} :::

請撰寫一個程式來計算一棵演化樹 TT 的「指紋」 f(T)f(T)。因為 f(T)f(T) 可能很大,所以你只要求出 f(T)f(T) 除以 109+710^9 + 7 的餘數。

输入格式

$$\begin{aligned} &m \\ &u_1 \ v_1 \\ &u_2 \ v_2 \\ &\vdots \\ &u_{m-1} \ v_{m-1} \end{aligned}$$
  • mm 代表演化樹 TT 的點數量。
  • uiu_iviv_i 代表的是在 TTuiu_iviv_i有一條邊。

输出格式

aa
  • aa 代表給定的演化樹 TT 的指紋除以 109+710^9 + 7 的餘數。
8
4 6
3 6
6 7
7 1
7 8
8 2
8 5
108
2
1 2
1

提示

測資限制

  • 2m1062 \le m \le 10^6
  • 1ui,vim1 \le u_i, v_i \le m
  • 輸入的數皆為整數。
  • 保證給定的圖是一棵連通的演化樹。

評分說明

本題共有三組子任務,條件限制如下所示。 每一組可有一或多筆測試資料,該組所有測試資料皆需答對才會獲得該組分數。

子任務 分數 額外輸入限制
1 7 m1000m \le 1000
2 31 演化樹的所有內部節點 vv 的 deg(vv) 都等於 33m105m \le 10^5
3 62 無額外限制。