2024 CT02 模擬賽

wangyibo201026發表於2024-08-01

\(\text{Contest 1}\)

\(\text{Heavenly Altitudes}\)

\(\text{description}\)

給你一個集合 \(S = \{1, 2, ..., n\}\),要求分成 \(m\) 段,段之間不考慮順序,段中的元素不考慮順序,現給你每段的最小值 \(a_1, a_2, ..., a_m\),求有多少種合法的劃分方式,答案對 \(10^9 + 7\) 取模。

\(1 \le n \le 10^6\)

\(\text{solution}\)

十多分鐘手刃了。

考慮到一定是從大到小考慮,因為大的不會對小的造成更多影響。

假設已經從大到小排序,根據組合直覺,答案應該是:

\[\sum_{i = 1}^m \binom{n - a_i - (m - i)\frac{n}{m}}{\frac{n}{m} - 1} \]

因為組合意義算就好了(每次剩下的數是固定的)。

\(\text{Seeker Temple}\)

\(\text{description}\)

給定 \(n\) 個質數 \(a_1, a_2, ..., a_n\),定義一個集合 \(S = \{x|x = a_1^{p_1}a_2^{p_2}...a_n^{p_n}\}\),其中 \(p_1, p_2, ..., p_n \ge 0\),問你 \(S\) 中第 \(k\) 小的數是多少。

\(1 \le n \le 16, 2 \le a_1, a_2, ..., a_n \le 100, 1 \le ans \le 10^{18}\)

\(\text{solution}\)

這個題確實挺好的。

根據數學直覺和部分分,那麼這個集合裡的數一定不會太多,但是仍然有 \(10^8\) 左右的級別,考慮到有 \(n \le 8\) 的部分分,我們考慮拆成兩個部分分別處理出來 \(S\) 集合,如果我們是隨機的話,那麼兩個集合都是不會大於 \(10^6\) 這個級別(其實只有 \(10^5\) 級別左右),考慮我們二分答案,每次檢查答案是否合法就把兩個 \(S\) 集合合併起來,算一下(裡面再套個二分),這樣子複雜度就是 \(O(n \log^2 n)\) 級別的了。

主要是要想到折半(其實也沒有什麼套路),其實只要是搜尋資料範圍小就可以想折半。

相關文章