CF1406E Deleting Numbers

dcytrl發表於2024-10-08

題意簡述

互動題,給定集合 \(S=\{1,2,\cdots,n\}\) 和一個隱藏的數 \(m\),你需要使用不超過 \(10^4\) 次操作猜出 \(m\),操作型別如下:

  • A x,查詢在 \(S\) 中是 \(x\) 的倍數的數的個數。
  • B x,查詢在 \(S\) 中是 \(x\) 的倍數的數的個數,並把這些數刪去,但是 \(m\) 不會被刪去。
  • C x,表示你猜的 \(m=x\)

\(1\le m\le n\le 10^5\)

分析

給出一個常數:\(p(10^5)=9592,r(10^5)\approx9700\)\(p(n)\) 指的是 \([1,n]\) 的質數個數,\(r(n)\) 指的是 \([1,n]\) 的質數。

考慮到每個 \(m\) 都可以寫成唯一分解的形式 \(\prod_i p_i^{c_i}\),考慮列舉每一個 \(p_i\),使用一次 B 操作刪去 \(p_i\) 的所有倍數,然後查詢此時 \(p_i\) 倍數個數。若為 \(1\),那麼 \(p_i\)\(m\) 的其中一個質因子,暴力列舉每一個 \(p_i^k\) 使用 A 操作就能得到 \(m\) 在這個質因數下的具體指數。

但這樣的詢問次數是 \(p(n)+r(n)\approx19200>10^4\),不能透過。

考慮最佳化,一個很經典的套路是對質因子根號分治,設閾值 \(B=\sqrt n\)\(\le B\) 的質因子可以向之前那樣暴力計算,而質數冪的數量大概在 \(\dfrac{B}{\ln B}\times \log_{p} n=O(B)\) 量級,次數較小,可以承受。

\(m\) 至多有一個 \(>B\) 的質因子,若 \(m\) 不為 \(1\) 或者 \(>B\) 的質數,那麼我們只需要對每個質因子使用 A 操作,若 \(m\) 包含某個質因子,那麼在對這個質因子使用 A 操作返回的答案是 \(2\),那麼只需要 \(p(n)\) 次操作就可以求出答案。

但如果 \(m\)\(1\) 或者 \(>B\) 的質數,無論對那個質因子操作返回的答案都是 \(1\),這種情況下我們只能使用暴力方案求解,次數還是爆炸。

發現對每個質因子都使用 A 操作 check 太浪費了,考慮把多個質因子批次刪除之後一起使用 A 操作 check。對質因子分塊,設塊長 \(C=100\),考慮逐塊查詢,將塊內質因子用 B 操作刪掉後查詢 A 1,若返回的答案不為 剩餘的質因子數+1,那麼 \(m\) 落在這個塊內,暴力 check 即可。次數為 \(B+p(n)-p(B)+C+\frac{p(n)}{C}\le 10^4\),可以透過。

相關文章