hzwer%%%,czy%%%
题目描述 Description
czy很火。因为又有人说他虚了。为了证明他不虚,他决定要在这次比赛AK。现在他正在和别人玩一个游戏:在一棵树上随机取两个点,如果这两个点的距离是 4 4 4的倍数,那么算czy赢,否则对方赢。现在czy想知道他能获胜的概率。
输入 Input
本题多组数据。对于每组数据:
第一行一个数 n n n,表示树上的节点个数。
接下来 n − 1 n-1 n−1条边 a , b , c a,b,c a,b,c描述 a a a到 b b b有一条长度为 c c c的路径。
当 n = 0 n=0 n=0时表示读入结束。
数据组数不超过 10 10 10。无部分分。
输出 Output
最终输出的概率要求分数的分子和分母的和尽量小且非负数。
样例输入 Sample Input
5
1 2 1
1 3 2
1 4 1
2 5 3
0
样例输出 Sample Output
7/25
限制 Limits
数据范围
Time Limit : 2s & Memory Limit : 128MB
树上询问两点间距离,当然是点分治题……但是
4
4
4的倍数?
统计
dis
i
\text{dis}_i
disi为在
4
4
4的剩余系下两点间距离为
i
i
i的点对个数。然后合并就容易推得了……然后注意不同子树之间统计的处理(再记录一个
dp
\text{dp}
dp数组处理)。
最后的答案?
先考虑在树上随意取点,考虑到点分治统计中的无序性(也就是同一条路径会被统计两次),所以随意取点的可能性为
n
2
n^2
n2,取出为
4
4
4的倍数的路径数需要乘以
2
2
2。因为
0
0
0也是
4
4
4的倍数,取到的两点相同时可以计入答案,可是点分治里没有统计这种情况,所以要加上
n
n
n,然后化简个分数,输出答案。
时间复杂度
O
(
T
n
log
2
n
)
O(Tn\log_2n)
O(Tnlog2n)。
Code