分数运算模拟
以NOIP2020第一题排水系统一题为例子。
思路
如何模拟分数运算,我们先来看看小学的时候我们是怎么算分数的。
a
b
+
c
d
=
a
d
+
b
c
b
d
\frac{a}{b}+\frac{c}{d}=\frac{ad+bc}{bd}
ba+dc=bdad+bc
就是这样的通分运算。如果可能的话最后的结果还要化为互质。
这不就思路吗:我们只需要模拟通分和约分过程就可以了。
代码
#define ll long long
inline void add(int u,ll x,ll y){//x是被加数的分子,y是被加数的分母
if(y==0)return;//y为0无意义
if(yy[u]==0){xx[u]=x;yy[u]=y;return;}//加数为0
ll p1=xx[u]*y+yy[u]*x;
ll p2=yy[u]*y;//通分
ll p3=gcd(p1,p2);
xx[u]=p1/p3;
yy[u]=p2/p3;//约分
return;
}
ll gcd(ll x,ll y){
if(y==0) return x;
return gcd(y,x%y);
}