Nhận xét đầu tiên: để ⌊ab⌋⌊ac⌋⌊bc⌋>0 thì bộ ba số này phải thỏa điều kiện a>b>c. (1)
Chỉ riêng với nhận xét này, bạn đã có thể giảm thời gian chạy code trâu xuống 6 lần.
Gọi f(x) là tổng ⌊xy⌋ với mọi y ∈ A và 1≤y≤x.
- Ta nhận thấy x và f(x) tỷ lệ thuận với nhau.
- Ngoài ra, khi xét đến x, ta thấy rằng chỉ có các giá trị y là ước của x mới làm tăng f(x) lên 1. (2)
Từ đây, ta có một ý tưởng là cố định a và b trước, khi này ta sẽ ngay lập tức có được ⌊ab⌋, việc còn lại là tính tổng của các ⌊ac⌋⌊bc⌋ thôi.
Khi đã cố định a, ta duyệt qua các giá trị b sao cho b<a đồng thời b ∈ [1...a).
Như đã nói ở trên, ý tưởng chính của thuật toán là khi duyệt đến b, ta phải tính được tổng ⌊ac⌋⌊bc⌋. Để làm được việc này, ta có thể dựa vào nhận xét (2): chỉ cần duyệt qua các giá trị c là ước của b, bước này tốn O(số ước của b).
Để liệt kê được các ước của b, ta có thể dựa vào sàng nguyên tố để có được sàng ước và chuẩn bị trước với độ phức tạp O(n∗logn)
Độ phức tạp thời gian: ~O(n2∗t+n∗logn)(t là hằng số biểu diễn cho bước duyệt qua các c làm f(b) thay đổi, t ~ 8)
*Note: mình thấy trong phần all submissions cũng có nhiều người dùng prefix sum, nhưng vì quá gà nên mình không hiểu được ToT.