Lời giải sẽ dùng các nhận xét từ lời giải ở bản dễ, cụ thể:
Vì chia hết cho và , nên số đó phải chia hết cho , suy ra chữ số tận cùng luôn là .
Với mỗi số chia hết cho thì tổng số chữ số của nó luôn chia hết cho .
Để giải quyết được bài toán, chúng ta xét một bản dễ hơn như sau:
Cho một xâu , hãy đếm xem có bao nhiêu cặp sao cho xâu là xâu đối xứng và có độ dài lẻ.
Vì nên chúng ta không thể dùng quy hoạch động để giải quyết bài toán, cho nên ta cần một cách nhanh hơn để đếm số cặp.
Nhận thấy rằng, nếu xâu là xâu đối xứng thì xâu cũng là xâu đối xứng. Cho nên, với mỗi vị trí , ta tìm độ dài lớn nhất sao cho xâu là xâu đối xứng.
Để tìm được giá trị , chúng ta có hai cách: chặt nhị phân và dùng hash để kiểm tra trong , hoặc dùng thuật toán Manacher trong .
Như vậy, đáp án của bài toán trên chỉ là tổng của mọi .
Trở lại với bài toán chính, không chỉ kiểm tra xâu đối xứng mà chúng ta cần kiểm tra thêm xâu có chia hết cho .
Với mỗi , ta chỉ xét những j sao cho tổng chữ số của chia hết cho và .
Chúng ta chia thành phần:
- Phần đầu: .
- Phần giữa: .
- Phần đuôi: .
Gọi tổng chữ số của phần lần lượt là , và . Chúng ta có nhận xét như sau:
Vì xâu đối xứng nên . Vì vậy điều kiện để xâu chia hết cho là .
Sau khi thử hết các giá trị modulo, ta rút ra được .
Như vậy, với mỗi , chúng ta cần đếm số sao cho thỏa mãn:
Việc đếm có thể giải quyết bằng tổng tiền tố.
ĐPT: nếu dùng Manacher, nếu dùng hash.
Comments