1 条题解
-
0
题解:组合数奇偶性与二进制子集
问题转化
给定长度为 的序列 (互不相同),求满足以下条件的不上升子序列(长度 )个数:
- $\prod_{i=2}^k \binom{a_{b_{i-1}}}{a_{b_i}} \bmod 2 = 1$(即每个组合数都是奇数,且乘积为奇数)
关键定理:Lucas 定理
当且仅当 的二进制表示是 的二进制表示的子集,即 (按位与)。
证明:由 Lucas 定理,$\binom{n}{m} \bmod p = \prod \binom{n_i}{m_i} \bmod p$,其中 是 的 进制位。对于 ,$\binom{0}{0}=1,\binom{1}{0}=1,\binom{1}{1}=1,\binom{0}{1}=0$。所以 当且仅当每个二进制位满足 ,即 的二进制位是 的子集。
条件转换
对于子序列 ,需要 对所有 成立。
由 Lucas 定理,这等价于 的二进制位是 的二进制位的子集,即 。
由于 且二进制子集关系成立,实际上这等价于 的二进制 1 的位置包含了 的二进制 1 的位置。
转化为 DAG 路径计数
将每个数 视为节点,若 且 且 ,则从 向 连有向边。
我们需要统计所有长度 的路径(即节点序列)的条数。
设 表示以 为结尾的路径条数(路径长度至少为 1,即包含 自身作为最后一个节点),则 ,其中 表示存在符合条件的边。
最终答案为 (减去长度为 1 的路径,因为我们需要长度至少为 2)。
优化边数
直接建边 不可行。需要利用二进制子集的性质。
条件 且 (由于二进制子集蕴含 ,所以 自动满足)且 。
因此,对于每个 ,它能从前面的所有 转移过来,只要 的二进制包含 的所有 1 位。
枚举超集
对于固定的 ,它的所有超集 (即 )且 都可以转移到 。
由于 互不相同,我们可以按输入顺序处理,用桶记录每个值的 值。
但 范围达到 ,直接枚举超集复杂度太高。
SOS DP(子集和 DP)优化
设 表示当前已处理的数中,值为 的 值之和(若 未出现则为 0)。
对于当前数 ,需要求所有超集 的 之和。
这是典型的高维前缀和(SOS DP)问题:。
可以在每处理完一个数后更新 。
具体步骤:
- 初始化 ,答案 。
- 按输入顺序处理每个 :
- 计算 (即所有超集的 值之和)
- 令 (以 结尾的路径数)
- 更新答案:
- 更新
- 更新高维前缀和 (因为 改变了)
高维前缀和更新
设值域 ,令 ,一般取 (因为 )。
我们需要维护数组 表示 。
当 增加 时,需要更新所有 满足 的 增加 。
这可以用 SOS DP 的经典方法:
for(int i=0; i<B; i++) { for(int mask=0; mask<=U; mask++) { if(mask & (1<<i)) { dp[mask] += dp[mask ^ (1<<i)]; } } }但这是离线做法。我们需要在线更新。
在线更新:当 增加 时,对所有 的 加 。
可以枚举 的所有子集:; 直到 。复杂度 。
由于 ,二进制位数最多 18,所以枚举子集复杂度 最坏,但平均较小。
但 可达 ,总复杂度 太大。
优化:分块更新
我们不需要每次查询都重新计算 ,可以维护 数组,查询时临时计算超集和。
查询 时,需要计算 。可以枚举 的所有超集:; 然后通过将 的某些 0 位变成 1 来枚举超集。
但 的 0 位最多 18 位,枚举超集也是 。
折中:值域分治
注意到 ,但实际二进制位 1 的个数不会太多。我们可以用 meet-in-the-middle。
将 18 位分成高 9 位和低 9 位。
对于数 ,记 ,。
条件 等价于 且 。
预处理数组 表示高 9 位为 ,低 9 位为 的 值。
查询时,对于 ,枚举所有 ,对于每个 ,需要低 9 位 的 之和。
对每个 ,预处理低 9 位的超集前缀和 。
这样查询复杂度 ,更新复杂度 。
具体实现
设 ,。
表示高 9 位为 ,低 9 位为 的 值之和。
表示对于固定的 ,低 9 位超集包含 的所有 之和。
初始化 和 为 0。
处理 :
- , 。
- 查询
- 枚举所有 满足 (即 )
- 对于每个 ,
- 答案加上
- 更新
- 更新 对所有 :
- 枚举 的所有子集 ,
枚举子集可以用 ; 循环。
复杂度
- 查询:枚举 超集,最多 个,对每个 取 是 ,总 。
- 更新:枚举 的所有子集,最多 个。 总复杂度 ,,,可过。
最终答案
累计 ,对 取模。
注意 和答案都需要取模。
边界情况
- 时答案为 0(因为需要长度至少为 2)
- 所有 互不相同
算法步骤
- 读入 和 。
- 预处理 ,。
- 初始化 和 为 0。
- 。
- 对 到 :
- ,
- 枚举 从 到 ,步长 1,但只取 的(即超集)
- 枚举 为 的所有子集:
- 输出 。
这样即可在 时间内解决问题,满足数据范围要求。
- 1
信息
- ID
- 6076
- 时间
- 1500ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者