Hướng dẫn giải của Bật cóc


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: tranxuantruong

Đây là một bài tập liên quan đến bội chung nhỏ nhất của 2 số a và b

Để giải bài này thì, nếu dùng for thì chắc chắn sẽ bị lỗi tle-time limit exceeded. Vì thế phải nghĩ ra công thức tính nhanh

Trong toán hình như có công thức là: bội chung nhỏ nhất(a, b) = tích(a, b) chia cho ước chung lớn nhất

Trong lập trình thì ta có cách tính nhanh bội chung nhỏ nhất trong o(logn) bằng giải thuật Euclid - cái này tự tìm hiểu để cải thiện kĩ năng tìm kiếm thông tin nha. Học được sẽ rất có ích đó.

Ngoài ra trong lập trình có công thức tìm nha giá trị ước chung lớn nhất của 2 số a, b là dùng hàm có sẵn:

int gcdcuaavab = __gcd(a, b); // 2 dấu gạch dưới liên tiếp nha _ _

code chỉ ngắn thế thôi, không phải khai báo thư viện gì cả.

Code

#include <iostream> 
using namespace std; 

int main(){
    #define int long long  /*cái này là một cái hack nhanh để thay thế từ "int" thành "long long" để không phải gõ dài */ 
                          // dùng long long vì dữ liệu đầu vào là 1e18, nên dùng int sẽ tràn số và ra kết quả sai

    // 1, input
    int x, y; cin >> x >> y; 


    // 2, process

    // int ans=x*y/__gcd(x, y); // code này đúng nhưng không tối ưu và dễ bị tràn số (nó nhân trước rồi mới chia sau), làm đáp án sai 
    int ans=x/__gcd(x, y)*y; // cái này chia bớt đi cho ước chung rồi mới nhân (khi chia thì số sẽ có thể nhỏ hơn và tỉ lệ bị tràn số sẽ giảm đi (những bài bình thường làm thế này là ok rồi nha))


    // 3, output
    cout <<ans <<endl; 



    return 0; 
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.