Editorial for Chia để trị cơ bản


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: UltimateWiener

tag: adhoc.

Subtask 1

K,X,Y nhỏ, nên ta có thể lấy trực tiếp số thứ K từ XY. Để làm được điều này, ta biểu diễn XY dưới dạng kiểu double, rồi nhân nó với 10K, sau đó lấy phần nguyên modulo 10 của kết quả.

Subtask 2

Với giới hạn này, ta không thể chia trực tiếp XY, vì độ chính xác sẽ quá thấp và sẽ dẫn đến sai số. Thay vào đó, ta tiến hành chia XY theo kiểu "tính tay", với mỗi bước lấy phần dư của X cho Y gán cho X, rồi nhân X với 10. Sau K lần, chữ số thứ K của XY sẽ chính là phần nguyên của XY. Vì mỗi truy vấn ta thực hiện K lần, nên độ phức tạp sẽ là O(Q×max(K)).

Subtask 3

Có thể biểu diễn quá trình "tính tay" bằng công thức sau: ((XmodY)×10)Ktimes÷Y=((X×10K)modY)÷Y

Ta có thể dễ dàng tính 10K trong log2(K) bằng cách nhân lũy thừa nhị phân. Vì vậy thuật toán của ta có độ phức tạp là O(Q×log2(max(K))).


Comments

Please read the guidelines before commenting.


There are no comments at the moment.