题解1
我成功地把一道 1000 bytes 1000\operatorname{bytes} 1000bytes 的签到题活生生地整成了 5000 bytes 5000\operatorname{bytes} 5000bytes 的毒瘤题。
我一开始的做法是给所有点反过来做 拓扑排序 ,然后按 拓扑序 从大到小枚举点,暴力地把它的水流完。因为我估算时出了锅,没有考虑到通分后分母最大是 6 0 11 60^{11} 6011 ,所以只开了 long long
,60分。
改题时我打了 高精度 ,非常麻烦,要重载 + , × , ÷ , mod , > +,\times,\div,\operatorname{mod},> +,×,÷,mod,> ,而在重载这些运算符的过程中我又用到了 − , ≤ , = = -,\le,== −,≤,== ,因此把它们也重载了,加上一些运算符还要重载参数为 int
的,直接上了 5000 bytes 5000\operatorname{bytes} 5000bytes 。
改完之后调了好久,接着就是 TLE 的问题了。又卡了卡常才过去。
题解2
其实根本不用那么麻烦,如果先除再乘的话是可以用 long double
水过去的。
先除再乘就是 a b + c d = lcm ( b , d ) b ⋅ a + lcm ( b , d ) d ⋅ c lcm ( b , d ) \begin{aligned}\frac{a}{b}+\frac{c}{d}=\frac{\frac{\operatorname{lcm}(b,d)}{b}\cdot a+\frac{\operatorname{lcm}(b,d)}{d}\cdot c}{\operatorname{lcm}(b,d)}\end{aligned} ba+dc=lcm(b,d)blcm(b,d)⋅a+dlcm(b,d)⋅c
因此可以先处理出 lcm ( b , d ) \operatorname{lcm}(b,d) lcm(b,d) ,再计算。
long double
的模运算可以用两种方法实现:
- a m o d b = a − ⌊ a b ⌋ ⋅ b a\mod b=a-\left\lfloor\frac{a}{b}\right\rfloor\cdot b amod