今天是2023/10/19,停课第四天,整理一下思路吧……
拓扑排序、数学
拓扑很简单,关键是这个分数到底会多大。
观察到题目中有限制m最大是10,最多经过10个中转点,出边小于等于5,这些限制很明显就是规定了p,q的范围。
前者说明总水量最多是10,而每次分流都只是进行了分配水量的操作,总水量不变,所以过程中的每个节点的水量都不大于总水量。
算出q的范围,乘10倍就是p的范围。
考虑只分流了一次,对于一个节点,他会加上所有入边来的流量。
如果不约分,最多有100000条边,分母最大是\(5^{100000}\),写高精度都难受。
考虑通分之后用最简分母q算,相同的分母不会让q变大,不同的分母会让q变成二者的最小公倍数。
所以q最大是1,2,3,4,5的最小公倍数,也就是60。
分流一层,q最大是60,换言之,我们可以把分母是6,15,……都变成分母是60的分数。
下一次分流,\(w_1=\frac{...}{60}+\frac{...}{60\times5}+...\),点自己本身可能被分流过一次,分母是60,其它来的点都是第二次分流的点,分母也都是60,把\(\frac{1}{60}\)提取出来,新的分母最大也是60。
所以二层分母最大是\(60^2\)。
……
中转十次,相当于分流11次,分母最大是\({6^{11}}{10^{11}}\)。
然后q和10q都在__int128范围内,搞定。
其实本来是想分别记录两个q1,q2,然后分母是q1*q2,每次只给较小的那个乘上,后来发现好像不行。
如果是高精度,写更相减损术可能会TLE,观察到分母都是若干个1,2,3,4,5的成绩,分解质因数只有2,3,5。
所以每次分子分母尝试同除2,3,5,……。
复杂度小于\(O(log_2Q+log_3Q+log_5Q)\)。