Hướng dẫn cho HackDream Blue 02-C: Lũy thừa của 3
Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Vì các số thành phần sau khi phân tách đều là luỹ thừa của ~3~, nên việc chọn số lớn hơn nếu có thể làm thành phần luôn tối ưu hơn chọn nhiều số thấp hơn (Nếu có thể chọn một số ~9~ thì luôn tốt hơn phải thay bằng 3 số ~3~ hoặc 9 số ~1~).
Từ đây bài toán sẽ có 2 giải thuật:
- Cách 1: Tìm ra ~x~ là luỹ thừa của ~3~ lớn nhất mà bé hơn bằng ~n~. Thực hiện phép lặp ~while~ để kiểm tra và chọn luôn các thành phần tạo thành ~n~ từ lớn đến bé (nếu ~x≤n~, in ra ~x~ và giảm ~n~ xuống ~x~, ngược lại giảm ~x~ xuống ~3~ để thử luỹ thừa thấp hơn).
- Cách 2: Ta nhận ra số lượng luỹ thừa và giá trị luỹ thừa của ~3~ được chọn bé nhất thực chất là dạng tam phân của ~n~. (Ví dụ: ~17~ có dạng tam phân là ~122~, nên kết quả sẽ là 1 số ~3^2~, 2 số ~3^1~ và 2 số ~3^0~, liệt kê ra sẽ là ~[9, 3, 3, 1, 1]~).
Độ phức tạp (cả 2 cách): ~O(log_3n)~
Bình luận