Solutions of GCD and LCM - MarisaOJ: Marisa Online Judge

Solutions of GCD and LCM

Select solution language

Write solution here.


User Avatar giavinh650    Created at    3 likes

# Nhắc nhở: ### Khuyến khích mọi người nên tự tìm hiểu, suy nghĩ lời giải trước khi tham khảo ### Nên đọc kỹ hướng dẫn trước khi tham khảo bài làm ___________________________________________________________________________________ ### Cách 1: duyệt Với mỗi giá trị từ $u$ đến $v$, ta sẽ đếm xem nó có bao nhiêu giá trị khác có UCLN và BCNN với nó là $u$ và $v$. _Chúng ta có thể tối ưu bằng cách sử dụng [giải thuật Euclid](https://vi.wikipedia.org/wiki/Gi%E1%BA%A3i_thu%E1%BA%ADt_Euclid) để tăng tốc độ tìm UCLN và BCNN, cũng như có thể chỉ duyệt các giá trị là bội của $u$._ Độ phức tạp: $O$($n^2 * \log(n)$) ### Cách 2: toán học Chúng ta biết rằng $a * b$ = $UCLN(a,b)$ * $BCNN(a,b)$, nên thay vì duyệt từng cặp một thì chỉ cần duyệt theo giá trị $a$ và tìm ra giá trị còn lại bằng công thức: $b$ = ($u * v$) / $a$. (tất nhiên $a$, $b$ phải đồng thời là bội của $u$ và là ước của $u * v$). Với mỗi cặp giá trị tìm được, ta sẽ phải kiểm tra lại để chắc chắn $a$, $b$ có UCLN = $v$ và BCNN = $u$ (vì có trường hợp $a$ = 6, $b$ = 30, dù cùng thỏa mãn là bội của $u$ và là ước của $u * v$ nhưng không có UCLN là 3 và BCNN là 60 như test đề bài). Nếu cặp ($a, b$) thỏa mãn cả 4 điều kiện: đều là bội của $u$, là ước của $u * v$, có UCLN là $u$ và có BCNN là $v$ thì cộng vào biến đếm. Độ phức tạp: $O$($n * \log(n)$) ## Bài giải: > Giải thuật: toán > Độ phức tạp: $O$($n$ * $\log(n)$) > Ngôn ngữ lập trình: **C++ 11** ```cpp #include<bits/stdc++.h> #define int long long #define endl "\n" using namespace std; signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int u,v,i,a,b,res=0,tich; cin>>u>>v; tich=u*v; for(i=u;i<=v;i+=u) { a=i; b=tich/i; if (__gcd(a,b)==u&&(a*b)/__gcd(a,b)==v) res++; } cout<<res; } ``` ### Lưu ý: có thể có nhiều hơn một cách làm nên các bạn không nhất thiết phải làm theo lời giải