Olympic lớp 10 HCM 04.2021: Phô mai¶
Viết chương trình tính số lần cáo chia phô mai cho hai gấu con.
Bài toán trích từ đề thi Olympic Thành phố tháng 04.2021 dành cho lớp 10.
Đề bài¶
Cách giải đề xuất¶
Ý tưởng chính¶
Theo đề bài, khi cáo chia phô mai thành 2 phần, 3 phần hoặc 5 phần thì cáo sẽ ăn \(\frac{1}{2}\), \(\frac{2}{3}\) hoặc \(\frac{4}{5}\). \(\frac{1}{2}\), \(\frac{1}{3}\) hoặc \(\frac{1}{5}\) còn lại được tiếp tục chia cho 2, 3 hoặc 5, và cứ như thế. Điều này có nghĩa rằng trọng lượng phô mai còn lại cuối cùng là ước của phép chia cho \(2^x.3^y.5^z\).
Cáo thực hiện chia nhiều lần cho đến khi trọng lương còn lại cuối cùng của miếng phô mai \(a\) và miếng phô mai \(b\) bằng nhau, có nghĩa rằng trọng lượng này chính là ước chung lớn nhất của \(a\) và \(b\).
Như vậy, ta sẽ:
- Bước 1: Tìm ước chung lớn nhất của \(a\) và \(b\).
- Bước 2: Đếm số lần chia \(a\) cho 2, 3 và 5 để đạt được ước chung lớn nhất, là \(x + y + z\).
- Bước 3: Tương tự, đếm số lần chia \(b\) cho 2, 3 và 5 để đạt được ước chung lớn nhất.
- Bước 4: Tổng số lần trên chính là kết quả bài toán.
Bước 1¶
Viết hàm tìm ước chung lớn nhất của hai số nguyên.
Bước 2¶
Đếm số lần chia a
lần lượt cho 2, 3 và 5 cho đến khi không còn chia được nữa.
Nếu giá trị a
còn lại vẫn không bằng ước chung lớn nhất thì kết thúc bài toán, không có cách chia phô mai thỏa yêu cầu.
Bước 3¶
Thực hiện tương tự bước 2, đếm số lần chia b
lần lượt cho 2, 3 và 5 cho đến khi không còn chia được nữa.
Nếu giá trị b
còn lại vẫn không bằng ước chung lớn nhất thì kết thúc bài toán, không có cách chia phô mai thỏa yêu cầu.
Bước 4¶
Không cần tính tổng các lần đếm, vì mỗi lần chia ở bước 2 và 3, ta đã tăng biến c
lên 1.
Toàn bộ chương trình¶
Code đầy đủ được đặt tại GitHub.