10.17 NOIP 模擬賽 T2. 箱思客
前言
很難不注意到我還有一個線段樹合并, 一個神秘的 \(\text{CSP-S T4}\) 排列沒有搞, 還有一個 \(\text{T3}\)
不管怎么樣一定要注意停滯, 解決
思路
不難發現就是每次取了之后是否放回去的一個期望問題
首先考慮概率期望問題, 本題比較好想的一種做法就是直接利用期望定義來做
我們先處理每次概率空間不變的問題, 也就是每次都把取了的數放回去的情況
處理這個問題時的草稿
考慮一個選擇 , 其中 , 而 , 我們取到其的概率是 , 事實上我們就需要找到所有的情形并計算概率與 的乘積之和
考慮怎么處理到所有的情形, 一種想法是
常用的方法是 表示選擇到第 個數, 且存在一個公約數是 的第 個質因數這樣一種情形的概率本質上是單個數的不同質因數個數有限
這個方法是有問題的, 但是不妨先列出一下轉移
然后我們要計算選擇一個 的概率來完成這個形態
需要注意的是, 這是一個無窮項求和, 但是并不困難
問題出在哪? 不難發現對于 不為一個質數的情況, 我們顯然會算重
當然不難猜測去重是一個容斥的形式, 但是這樣子計算復雜度不能保證, 而且由于 的存在, 算重的部分也不好處理
因此我們考慮換成另一種常見的處理方法, 即枚舉一個約數
考慮欽定最終 , 不妨找到 的倍數集合 , 則每次我們選擇集合內外的概率分別已知, 剩下的就是一個無窮項求和, 可以用等比數列求和公式計算
具體的, 記 表示在 個數中選出 的概率, 求 表示欽定最終 , 找到的形態概率之和
這樣仍然會算重, 但是去重是很簡單的, 我們只需要倒序處理, 然后每次處理掉 倍數即可
即
到這里我發現我對期望的計算還有問題, 讓我們來處理這一部分
不妨同樣設置 函數, 但是先不管去重
進而我們可以輕松地完成這一工作
考慮一個選擇 \(x_1, x_2, \cdots x_k \mid x_{k + 1}\), 其中 \(\gcd(x_1, x_2, \cdots, x_k) \neq 1\), 而 \(\gcd(x_1, x_2, \cdots, x_k, x_{k + 1}) = 1\), 我們取到其的概率是 \(\dfrac{1}{n^{k + 1}}\), 事實上我們就需要找到所有的情形并計算概率與 \(k\) 的乘積之和
首先, 刻畫形態的一種通用方法是 \(\rm{dp}\)
常用的方法是 \(f_{i, j}\) 表示選擇到第 \(i\) 個數, 且存在一個公約數是 \(i\) 的第 \(j\) 個質因數這樣一種情形的概率\((\)本質上是單個數的不同質因數個數有限\()\)
不難發現對于 \(\gcd(x_1, x_2, \cdots, x_k)\) 不為一個質數的情況, 我們顯然會算重
當然不難猜測去重是一個容斥的形式, 但是這樣子計算復雜度不能保證, 而且由于 \(x_{k + 1}\) 的存在, 算重的部分也不好處理
我們嘗試使用另一種方法, 欽定 \(\gcd(x_1, x_2, \cdots, x_k) = g\), 然后處理符合條件的情形
具體的, 記 \(p(x)\) 表示在 \(n\) 個數中選出 \(a_i = x\) 的概率, 求 \(f(x)\) 表示欽定最終 \(\gcd(x_1, x_2, \cdots, x_k) = x\), 找到的形態所計算的概率與 \(k\) 的乘積之和
考慮 \(f(x)\) 還有更好的形式
我們需要考慮去重, 令正確的 \(f(x)\) 為 \(f_t(x)\)
這種形式是顯而易見的
還有一個小問題, 期望應當是 \(\sum f(x) + 1\), 因為我們沒有考慮 \(x_{k + 1}\) 同樣帶來 \(1\) 的貢獻
現在我們處理每次概率空間變化的問題, 也就是每次取了數之后就把他拿出來
我們仍然采用形態法, 仍然考慮一個選擇 \(x_1, x_2, \cdots x_k \mid x_{k + 1}\), 其中 \(\gcd(x_1, x_2, \cdots, x_k) \neq 1\), 而 \(\gcd(x_1, x_2, \cdots, x_k, x_{k + 1}) = 1\)
記 \(c(x)\) 表示 \(a_i = x\) 的個數, \(g(x)\) 表示欽定最終 \(\gcd(x_1, x_2, \cdots, x_k) = x\), 找到的形態所計算的概率與 \(k\) 的乘積之和
我們來分析一下處理的復雜度
等價于分析 \(\mathcal{O} \Big(\sum_{x \geq 1} C(x)\Big)\), 考慮每個數會在自己的因數處被計算一次, 而 \(v\) 的因數個數大概也就 \(\mathcal{O}(v^{\frac{1}{3}})\), 我們不難發現是 \(10^8\) 級別可以勉強接受
注意我們仍然要用相同的方法去重并統計進期望里
總結
\(\gcd(\alpha_i, \alpha_j) > 1\) 的本質是存在質數 \(x | \alpha_i, x | \alpha_j\) 且 \(x > 1\), 因此如果要求一堆數的 \(\gcd\) 大于 \(1\), 那么可以枚舉存在的質因數/因數然后做判斷
\(\sum_{i=1}^{k} iP^i(x)\) 可以轉化成后綴和相加處理
關于 \(\gcd\) 的一種去重方法
嘗試計算 \(x \mid \textrm{gcd}\) 的 \(\textrm{gcd}\) 個數從而計算出 \(x = \textrm{gcd}\) 的 \(\textrm{gcd}\) 個數, 具體來講, 倒著處理, 每次刪去當前考慮到的 \(\gcd\) 的倍數, 復雜度是 \(\mathcal{O} (V \ln V)\) 級別的

浙公網安備 33010602011771號