https://lqdoj.edu.vn/problem/dhbb23tc
Cho một số nguyên dương .
Yêu cầu: Tìm chữ số tận cùng khác 0 của . Trong đó kí hiệu là bội chung nhỏ nhất của .
Dữ liệu:
Kết quả:
Giới hạn:
Thời gian: 1000ms cho mỗi testcase.
Gọi là giá trị của .
Trước tiên chúng ta sẽ tìm giá trị của . Dễ thấy có thể rất lớn nên ta chỉ lưu nó dưới dạng phân tích của nó ra thừa số nguyên tố.
Đến đây chúng ta sẽ tìm cách loại bỏ các chữ số 0 tận cùng của . Vì mỗi cặp thừa số và sẽ cho ra tích bằng nên ta nghĩ đến việc loại bỏ nhiều nhất các cặp số từ các thừa số nguyên tố của . Ta không cần xét các lũy thừa của , như vì nó đã được phân tích thành các lũy thừa của , của rồi.
Việc cuối cùng là nhân các lũy thừa lại với nhau đồng thời mod .
(Sách giáo khoa Toán 6 cũ tập 1, chương I. Ôn tập và bổ túc về số tự nhiên, §18. Bội chung nhỏ nhất, mục 2 trang 58): Muốn tìm BCNN (Bội chung nhỏ nhất) của hai hay nhiều số lớn hơn 1, ta thực hiện ba bước sau:
Ta nghĩ đến hướng giải đầu tiên: gọi là mảng lưu các thừa số nguyên tố cùng với số mũ của nó. chạy 1 vòng lặp từ đến , với mỗi ta phân tích nó ra thừa số nguyên tố. Sau đó cập nhật giá trị lớn nhất của mỗi thừa số nguyên tố trong mảng .
Tuy nhiên, với cách làm trên sẽ dẫn đến quá thời gian quy định của đề bài, bởi với mỗi ta phải chạy tối đa lần các phép sau:
Ta nghĩ đến một hướng khác:
Nhận thấy, ở cuối cùng ta chỉ cần những số mũ lớn nhất có thể của các thừa số.
Nhận xét: với một thừa số và giới hạn , khi càng lớn thì số mũ cao nhất có thể của (trong ) sẽ càng có thể lớn (Có thể xem và kiểm chứng ở đây. Link 1 Link 2). Lấy ví dụ:
(nếu thì ).
.
.
Vì vậy, ta chỉ cần duyệt qua các tất cả các thừa số nguyên tố , với mỗi thừa số ta tìm số mũ lớn nhất sao cho . Hàm để tính số mũ này có độ phức tạp là . Sau đó ta gán số mũ lớn nhất cho mỗi thừa số trong .
Cách làm này tối ưu thời gian đáng kể, bởi thay vì duyệt qua lần như cách trước, ta chỉ cần chạy tối đa khoảng lần hàm và như thế sẽ không bị quá thời gian.
Tối ưu 13 Jan 2024: Ta vẫn có thể tiếp tục tối ưu bằng cách với mỗi thừa số khác và ta lũy thừa và nhân thẳng vào đáp án, đỡ tốn không gian lưu trữ và đỡ tốn thời gian chạy 1 vòng lặp. Đến đây nếu làm theo cách này có thể bỏ qua bước 2 và 3, xuất ra đáp án. Code tham khảo nằm ở cuối trang.
Bước này thì rất đơn giản. Vì nên ta loại bỏ từng cặp từ cho đến khi không làm được nữa.
Viết một hàm trả về giá trị của .
Đáp án sẽ là
Thời gian: 398ms;
Bộ nhớ: 6.97mB.
13/1/2024
Thời gian: 188ms;
Bộ nhớ: 4.25mB.