Loading

CodeForces-2056F1&F2

VP 了 round 997,遂补题。

题目

给定 \(n,m\),求所有长度为 \(n\)\(a\) 序列(\(0\le a_i<m\)),序列满足出现数字个数不减,所有序列中位数的异或和。
F1:\(n\le 2^{200},m\le 500\),F2:\(n\le 2^{2·10^5},m\le 10^9\)

F1

分析

考虑到 \(m\) 比较小不妨统计合法数字集合,每个数字集合的中位数固定,因此每个数字集合的贡献与数字集合方案数的奇偶性有关,记集合 \(S=\{(p_1,c_1),(p_2,c_2),\dots,(p_k,c_k)\}\),则方案数奇偶性即:

\[\frac{n!}{\prod c_i!} \bmod 2 \]

这个显然不是很可做,考虑换成组合数形式,即:

\[\prod_{i=1}^kC_{n-\sum_{j=1}^{i-1}c_j}^{c_i} \bmod 2 \]

这样可以直接 \(Lucas\) 定理,现在转化为数位问题,这让我想到了 这里的第二个题,仔细观察该式是否能带来更多限制。
约定若 \(x\) 在二进制下为 \(y\) 的子集为 \(x\in y\),首先有显然的 \(c_1\in n\),接下来有 \(c_2\in n-c_1\)\(c_3\in n-c_1-c_2\)\(\dots\)\(c_k \in n-\sum_{i=1}^{k-1} c_i\),且 \(\sum_{i=1}^k c_i=n\),容易看出 \(c_i\) 本质上是 \(n\) 二进制下的数位划分,如何确定中位数?其实就是分配到最高位的那个数,因为拥有绝对众数的序列的中位数一定是绝对众数。至此可以开始进行计数了。
考虑枚举中位数 \(x\),记 \(popcount(n)=b\),则中位数为 \(x\) 的合法序列个数为 \(\sum_{i=1}^m \{^b_i\}C_{x}^{i-1}\)
意为枚举数字集合大小,其中\(\{^b_i\}\) 为第二类斯特林数,总复杂度 \(O(m^2)\)

F2

分析

显然要进行组合推导。

posted @ 2025-01-27 01:00  mmilesask  阅读(20)  评论(0)    收藏  举报