# Lời giải bài tính giá trị của biểu thức
###### 📌 Tags: `Math` .
____
## Ý tưởng :+1:
* Cộng giữa hai phân số ta phải quy đồng là điều đương nhiên
* Để quy đồng hai phân số ta phải lấy tử nhân với (BCNN của hai mẫu số chia cho mẫu số tương ứng )
* Ta có $BCNN(a , b) = a * b / GCD(a , b)$
___
## Các thuật toán tìm ước chung lớn nhất
Ta có thể tham khảo ở [đây](https://vnoi.info/wiki/translate/he/So-hoc-Phan-1-Modulo-gcd)
____
## Nhận xét :bulb:
+ Quy đồng hai phân số rồi sau đó lấy tử cộng tử
+ Tiếp tục tối giản phân số kết quả bằng cách chia cả tử và mẫu cho ước chung lớn nhất của tử và mẫu
____
## Code
> **Time:** $O(1)$
> **Space:** $O(n)$
> **Algo:** Sieveing .
> [color=lightgreen]
:::success
:::spoiler code
``` cpp
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll GCD(ll a1 , ll b1){
while(b1 != 0){
a1 = a1 % b1;
ll tmp = b1;
b1 = a1;
a1 = tmp;
}
return a1;
}
const ll INF = 1e18 + 7;
const ll MAXN = 1e6 + 7;
ll a , b , c , d ;
int main(){
freopen("EXPVAL.inp" , "r" , stdin);
freopen("EXPVAL.out" , "w" , stdout);
cin >> a >> b >> c >> d;
ll base1 = GCD( b , d);
ll LCM = b * d / base1;
ll tu1 = a * (LCM / b) ;
ll mau1 = LCM;
ll tu2 = c * (LCM / d);
ll mau2 = LCM;
tu1 += tu2;
ll base = GCD(tu1 , mau1);
tu1 /= base;
mau1 /= base;
cout << tu1 << " " << mau1 ;
return 0;
}
```
:::success
:::::