雅禮集訓 2018 Day4 Magic

2022-05-15 13:52:52 字數 1118 閱讀 5545

傳送門

本部分**於 這位大佬

題中要求本質不同的序列數量,不太好搞。我們考慮給相同顏色的牌加上編號,這樣所有牌都不相同。那麼如果我們求出了答案,只需要將答案除以 \(\prod a_i!\) 就好了。

「恰好有 \(k\) 對」不能直接求,考慮容斥,如果我們求出了 \(g(x)\) 表示至少有 \(x\) 對的方案數,那麼答案即為 \(\sum_\limits^ (-1)^\binomg(i)\)。現在的問題是如何求 \(g(x)\)。

我們將這 \(k\) 個魔術對分配到 \(m\) 種顏色中去,即:第 \(i\) 種顏色含有 \(b_i\) 個魔術對(滿足 \(b_i < a_i\))。接下來可以做乙個 dp,依次考慮每一種顏色,設 \(f_\) 表示考慮了 \(i\) 種顏色,且已有 \(j\) 個魔術對的方案數。對於 \(i\),我們需要計算第 \(i\) 種顏色有 \(b_i\) 個魔術對的方案數是多少。由於我們已經視所有牌均不同,因此我們可以從中任選 \(b_i\) 張牌來作為所有魔術對的第二張牌,方案數為 \(\binom\)。接下來依次將這 \(b_i\) 張牌插入到原序列中去。由於必須插到相同顏色的牌的後面,因此第一張牌有 \(a_i - b_i\) 個位置可以插入,第二張牌有 \(a_i - b_i + 1\) 個位置可以插入......因此總方案數為 \(\binom \times (a_i - b_i)(a_i - b_i + 1)\cdots(a_i - 1) = \binom \times \frac\)。這樣,我們只需列舉 \(b_i\) 然後轉移即可。

不過注意這樣求得的 \(f_\) 並不是最終的 \(g(x)\)。由於構成魔術對的 \(x\) 張牌已經確定,不構成魔術對的 \(n - x\) 張牌可以任意排列,因此 \(g(x) = f_ \times (n - x)!\)。

這樣做 dp 的複雜度是 \(\mathcal o(nm)\) 的,可以過 64 分。

注意到上面的 dp 其實是做了 \(m\) 次卷積,因此我們可以使用 ntt 進行優化。不過直接做 \(m\) 次多項式乘法時間複雜度並不能得到優化,注意到 \(f_\) 中 \(j\) 一維的上界是不斷合併增大的,因此我們可以使用乙個堆,每次取出長度最小的兩個陣列進行 ntt 合併即可,這樣複雜度就***了,時間複雜度為 \(o(m \log^2n)\)。

雅禮集訓Day4

今天炸的1p。t1,給你100次詢問,每次l,r,選 l,r 中的若干數進行異或,求有多少種結果,1 l r 1e18.做法 暴力很顯然是將l,r這些數加入線性基,然後算一下線性基里有多少個數。我們可以考慮線性基的每一位最早在多久被加入。這個就可以看l了,它二進位制的最高位很顯然是一開始就加入線性基...

雅禮集訓Day4

今天炸的1p。t1,給你100次詢問,每次l,r,選 l,r 中的若干數進行異或,求有多少種結果,1 l r 1e18.做法 暴力很顯然是將l,r這些數加入線性基,然後算一下線性基里有多少個數。我們可以考慮線性基的每一位最早在多久被加入。這個就可以看l了,它二進位制的最高位很顯然是一開始就加入線性基...

雅禮集訓 2018 Day7 A 題解

題意 雅禮集訓 2018 day7 a 題解 線段樹處理。考慮只有一種與的操作。顯然當乙個區間的或和與上將要與的數還是原數時就沒必要遞迴計算了,剪枝剪掉。當一段區間與和與上將要與的數等於這段區間或和與上將要與的數時,更新後這段區間的最小值位置還是更新前的位置。由於一次操作至少將數的乙個二進位制改變,...