Bài gồm 3 subtask
Subtask 1 : $b_1, b_2 \leq 10^3$
Subtask 2 : $b_1, b_2 \leq 10^6$
Subtask 3 : Không có giới hạn gì thêm
Lời giải bài 3 :
Subtask 1 : Trâu bò cày ruộng
Subtask 2 : Cố định miền $x$ và đếm số lượng miền $y$ thỏa mãn
Subtask 3 : Tối ưu từ Subtask 2
Gọi $f(n)$ là số lượng các cặp $(x, y)$ thỏa mãn :
- $a_1 \leq x \leq b_1$
- $a_2 \leq y \leq b_2$
- $1 \leq x \times y \leq n$
Từ đây ta tính được đáp số của bài toán là $f(b_3) - f(a_3 - 1)$.
Giờ việc của ta là tính hàm $f$ nhanh.
Cũng như Subtask 2, ta cố định miền $x$ lại, nhưng ta lại thấy rằng miền $x$ lúc này thật sự không nhỏ và việc duyệt đi nhiều lần chắc chắn sẽ dẫn tới TLE.
Đầu tiên, với một giá trị $x$, ta thấy giá trị $y_{\max}$ (bỏ qua điều kiện thỏa mãn trong đoạn $[a_2, b_2]$) sẽ là $\frac{n}{x}$ (chia làm tròn xuống)
Xét $x_1, x_2$ ($x_1 \neq x_2$), nếu $\frac{n}{x_1} = \frac{n}{x_2}$ (chia làm tròn xuống) thì số lượng miền $y$ thỏa mãn của $x_1$ và $x_2$ sẽ **bằng nhau**.
Để chứng minh thì với mỗi miền $x$, nó sẽ đóng góp vào đáp án một lượng bằng giao điểm của $[1, y_{max}]$ với $[a_2, b_2]$. Mà khi $x_1$ có cùng $y_{\max}$ với $x_2$ thì ta dễ thấy chúng có cùng **lượng đóng góp** vào đáp án. Giả sử $x_1 \leq x_2$, thì với $x \in [x_1, x_2]$ đều cũng sẽ có **cùng lượng đóng góp**.
Vậy giờ bài toán của ta với mỗi miền $x$ **thuộc cùng** $y_{\max}$, ta chỉ cần tính của một giá trị $x$ của vùng đó và nhân cho số lượng giá trị cùng vùng.
Nhưng bây giờ làm sao để ước tính số lượng vùng $y_{max}$ ?
Có một tính chất quan trọng là trong dãy số $\frac{n}{1}, \frac{n}{2}, ..., \frac{n}{n}$ (các phép chia đều làm tròn xuống) chỉ có nhiều nhất $2\sqrt{n}$ giá trị phân biệt.
Bời vì những giá trị chỉ giảm xuống khi nó gặp ước số của $n$, cùng với đó $n$ không thể nào có số ước nhiều hơn $2\sqrt{n}$ được nên ta sẽ đảm bảo được thời gian chạy.
Vậy chi phí để tính một hàm $f(n)$ lúc này là $O(2\sqrt{n} \times \log n)$
Phần $\log$ phát sinh để ta tìm những đoạn cùng $y_{\max}$
Link code : https://ideone.com/182apG