1 条题解
-
0
题解:购买方案计数
问题转化
给定 ,要求统计所有非空集合 ,满足:
对于每个询问 ,求有多少个这样的集合 包含 。
答案对 取模。
关键推导
1. 基本转化
若 则无解,答案为 。 令 ,则问题转化为:选择若干个数 ,使得:
- 是 的倍数,即
即转化为 的情况:在 中选择若干数,,。
2. 因子分解
设 ,其中 是质数。
对每个质因子 ,选择的数集合 中:
- 至少有一个数的 指数为 (保证 )
- 至少有一个数的 指数为 (保证 )
- 每个数的 指数在 之间
3. 独立计数
对于每个质因子 ,选择的数在 上的指数情况是独立的。 记 ,对于每个数,它在 上的指数可以是 ,但必须满足上述条件。
设对于质因子 ,有 个数指数为 , 个数指数为 ,且 ,。
4. 总方案数
先不考虑是否包含 ,计算总合法集合数。
设 ,需要 且包含所有 的质因子条件。
实际可选的数集合是 的约数集合中不超过 的部分。
令 $U = \{ d \mid d \text{ 是 } L' \text{ 的约数}, d \le M \}$。
我们需要 ,,且满足对每个质因子 :
5. 容斥计算
记 为满足条件的集合数。
用容斥:
- 去掉“至少一个质因子不满足 ”的条件
- 去掉“至少一个质因子不满足 ”的条件
设 表示“所有数的 指数都 ”(即 )
设 表示“所有数的 指数都 ”(即 )则合法集合 = 总非空集合 - 存在 满足 - 存在 满足 + 存在 满足 和 的交集 + ……
6. 约数筛选
对于每个子集 ,定义:
- :所有数的 指数 (对 )的限制下,可选的数的个数
- :所有数的 指数 (对 )的限制下,可选的数的个数
实际 对应 的约数中,被 整除且 的个数。
对应 的约数中,不被 整除(对 )且 的个数。7. 总方案公式
记 为满足“对 ,指数 ;对 ,指数 ”的数的个数。
则合法集合数:
$$\sum_{T_1 \subseteq [k]} \sum_{T_2 \subseteq [k]} (-1)^{|T_1|+|T_2|} \left(2^{F(T_1,T_2)} - 1\right) $$其中 ,且 可能相交。
8. 包含 的方案数
设 ,需要 是整数且 ,否则答案为 。
对每个询问 ,需要计算包含 的合法集合数。
固定 ,对于其他数的选择,必须满足:
- 集合整体 ,
- 包含
设 的质因数指数为 ()。
则条件变为:
- 对每个 :
- 对每个 :
即:
- 若 ,则其他数中必须有指数 (已满足),且必须有指数
- 若 ,则其他数中必须有指数 ,且必须有指数 (已满足)
- 若 ,则其他数中必须有指数 和
9. 计算包含 的方案数
令
对于其他数 ,必须满足:
- 对 :(无限制),但必须有某个 满足
- 对 :(无限制),但必须有某个 满足
- 对 : 任意,但必须有某个 满足 ,且某个 满足
用容斥计算不含 的其他数的选择方案数,再乘 (固定 在集合中)。
10. 实现简化
由于 (因为 ),可以 或 枚举所有质因子条件状态,对每个状态预处理可选的数的个数。
对每个询问 :
- 检查 且 ,否则输出
- 根据 的指数向量,确定
- 用容斥计算其他数的选择方案数
算法步骤
- 分解 的质因数
- 预处理 以内所有 的约数,对每个约数记录其指数向量
- 预处理 :指数向量满足某些条件的约数个数(mask 表示每个质因子的指数是否满足某些条件)
- 对每个询问 :
- 若 或 ,输出
- 计算 的指数向量
- 确定
- 用容斥计算其他数的选择方案数
- 输出
复杂度
- 预处理:,其中 是 的约数个数
- 每个询问: 或
- 由于 ,可过
- 1
信息
- ID
- 6067
- 时间
- 1400ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者