Editorial for Bedao Regular Contest 13 - COPRIME
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Gọi ~S_i~ là phần tử thứ ~i~ của tập ~S~, và ~K_x~ là số ước nguyên tố khác nhau của ~x~.
Vì ~1 \le S_i \le 10^6 \Rightarrow 1 \le K_{S_i} \le 7~.
Dễ thấy, số cặp số ~(x, y)~ (~x \le y~) nguyên tố cùng nhau và ~\text{lcm}(x, y) = S_i~ là ~2^{K_{S_i} - 1}~ (lưu ý: ta quy ước ~K_1 = 1~).
~\Rightarrow f(S) = \sum \limits_{i = 1}^{|S|} 2^{K_{S_i} - 1}~
Lúc này với mỗi truy vấn, ta sẽ đếm số tập hợp ~S~ khác nhau thỏa mãn:
~\sum \limits_{i = 1}^{|S|} 2^{K_{S_i} - 1} = n~
~l \le S_i \le r~
Số phần tử của tập hợp ~S~ là nhỏ nhất.
Vì ta muốn số lượng phần tử thuộc tập ~S~ là nhỏ nhất, ta có thể áp dụng cách tham lam sau: lấy tối đa các số ~x~ trong đoạn có ~K_x = 7~, sau đó tiếp tục lấy tối đa các số có ~K_x = 6~, rồi đến ~K_x = 5~, ...
Giả sử, trong đoạn ~[l, r]~ có ~C_i~ số có ~K_x = i~ (có ~C_i~ số cố ~i~ ước nguyên tố khác nhau); và ta lấy được ~D_i~ số có ~K_x = i~. Đáp án cho truy vấn sẽ là ~\prod \limits_{i = 1}^{7} \binom{C_i}{D_i}~.
Để trả lời truy vấn, ta có thể tiền xử lý bằng prefix sum (tổng tiền tố) để nhanh chóng tìm được ~C_i~.
Độ phức tạp: ~O(n)~ tiền xử lý, ~O(1)~ trả lời truy vấn.
Comments