ABC210F - Coprime Solitaire
看到這種兩面性問題,顯然想到 2-SAT。
給每個質數設置一個集合。(\(2\times 10^6\) 之內的質數有 \(148933\) 個)
先把每一個數字都質因數分解,如果某個數有質因數 \(x_1,x_2...\) ,就把這個數的位置、是正反面,加入 \(x_1,x_2\) 對應的集合中。
這樣一個集合中的數都不能同時共存,兩兩連邊 \(\neg X\ \or\ \neg Y\)(即若 \(X\) 則 \(\neg Y\))。
但是這樣每個集合要連 \(O(n^2)\) 條邊,顯然爆炸,於是我們想到前后綴優化連邊。
對於每個集合,我們令 \(P_i\) 為前綴的 "\(\neg\)" 連邊和,\(Q_i\) 為后綴的 ''\(\neg\)'' 連邊和。
則對於此集合的第 \(i\) 位,連邊 \(i\to P_{i-1},i\to Q_{i+1}\)。
這樣每個集合只用連 \(O(n)\) 條邊了。
總時間復雜度 \(O(n\log L)\),\(L=\max(A_i,B_i)\)。