Bài gồm 3 subtask
Subtask 1 :

b1,b2103
Subtask 2 :
b1,b2106

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 :

  • a1xb1
  • a2yb2
  • 1x×yn

Từ đây ta tính được đáp số của bài toán là

f(b3)f(a31).
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ị
ymax
(bỏ qua điều kiện thỏa mãn trong đoạn
[a2,b2]
) sẽ là
nx
(chia làm tròn xuống)

Xét

x1,x2 (
x1x2
), nếu
nx1=nx2
(chia làm tròn xuống) thì số lượng miền
y
thỏa mãn của
x1
x2
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,ymax]
với
[a2,b2]
. Mà khi
x1
có cùng
ymax
với
x2
thì ta dễ thấy chúng có cùng lượng đóng góp vào đáp án. Giả sử
x1x2
, thì với
x[x1,x2]
đề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
ymax
, 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

ymax ?
Có một tính chất quan trọng là trong dãy số
n1,n2,...,nn
(các phép chia đều làm tròn xuống) chỉ có nhiều nhất
2n
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
2n
đượ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(2n×logn)

Phần
log
phát sinh để ta tìm những đoạn cùng
ymax

Link code : https://ideone.com/182apG