cpp-004Đọc toàn bộ đề miễn phí

Ước chung lớn nhất và bội chung nhỏ nhất số lớn

Hệ thống mạng nơ-ron phân tán của AI Empire Academy cần đồng bộ hóa chu kỳ cập nhật trọng số giữa hai cụm GPU độc lập. Cụm thứ nhất phát tín hiệu sau mỗi A nano-giây, cụm thứ hai p…

C++Trung bình25 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

loopsnumber theoryoverflow preventionalgorithms

Kiến thức tiên quyết: while loop, functions, data types.

Nội dung đề bài

Mục tiêu kiến thức

  • Cài đặt thuật toán Euclid tìm ước chung lớn nhất (GCD) bằng vòng lặp với độ phức tạp O(log(min(A, B))).
  • Hiểu rõ hiện tượng tràn số nguyên (Integer Overflow) trong C++ và cách phòng tránh bằng kiểu dữ liệu long long.
  • Kỹ thuật tính bội chung nhỏ nhất (LCM) an toàn: chia trước nhân sau lcm(A, B) = Agcd(A, B) × B.

Mô tả bài toán

Hệ thống mạng nơ-ron phân tán của AI Empire Academy cần đồng bộ hóa chu kỳ cập nhật trọng số giữa hai cụm GPU độc lập. Cụm thứ nhất phát tín hiệu sau mỗi A nano-giây, cụm thứ hai phát tín hiệu sau mỗi B nano-giây (1 ≤ A, B ≤ 109).

Bạn hãy viết chương trình C++:

  • Tìm ước chung lớn nhất (UCLN) của A và B.
  • Tìm thời điểm đồng bộ hóa đầu tiên, chính là bội chung nhỏ nhất (BCNN) của A và B.

Cảnh báo kỹ thuật: Vì A và B có thể lên tới 109, tích A × B có thể đạt tới 1018, vượt quá giới hạn cực đại của kiểu số nguyên 32-bit int (tối đa ≈ 2.14 × 109). Bắt buộc phải sử dụng kiểu dữ liệu 64-bit có dấu long long. Hơn nữa, ngay cả khi dùng long long, nếu viết biểu thức (A * B) / gcd(A, B) thì phép nhân A * B vẫn có thể gây tràn số nếu giá trị vượt 9 × 1018. Kỹ thuật chuẩn là thực hiện phép chia trước: (A / gcd(A, B)) * B.

Quy ước nộp bài

  • Chỉ cần viết một chương trình đọc stdin và in ra stdout. Bài này không yêu cầu viết hàm.
  • Không dùng cout để in lời nhắc trước khi đọc dữ liệu. Lời nhắc sẽ lọt vào stdout và làm bài sai.
  • Chỉ in đúng nội dung ở mục Output. Không in thêm nhãn, dòng trống hay ký tự thừa.
  • Output được so khớp từng ký tự, phân biệt chữ hoa/thường và dấu câu.

Input

Một dòng duy nhất chứa 2 số nguyên dương A và B cách nhau bởi một khoảng trắng.

Output

In ra trên một dòng gồm 2 số nguyên cách nhau bởi một khoảng trắng: số thứ nhất là UCLN, số thứ hai là BCNN.

Ràng buộc

  • 1 ≤ A, B ≤ 109.
  • Thời gian chạy: 1000ms.
  • Bộ nhớ tối đa: 256MB.

Ví dụ 1

Input

12 18

Output

6 36

Ví dụ 2

Input

1000000000 999999999

Output

1 999999999000000000

Giải thích

Hai số nguyên liên tiếp nguyên tố cùng nhau nên gcd = 1. BCNN = 109 × (109 - 1) = 999999999000000000, giá trị này bắt buộc phải lưu trong kiểu long long.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.