1 条题解
-
0
子集选取:题解
思路
把集合约束拆成元素约束
固定一个元素 ,只关心它是否属于每个 。集合包含关系逐元素成立,所以不同元素之间没有耦合:先求一个固定元素有多少种合法的出现模式,再把这个数量取 次方即可。
对固定元素,把“属于”记为 ,“不属于”记为 。若某格为 ,它有效的左邻格、上邻格也必须为 。因此每一行中的 必然构成一个前缀。
做法
统计单个元素的模式
令 表示前 行合法,并且第 行恰有前 格为 的模式数,其中 。
当 时,上一行的前缀长度 可以是任意 ,因此
当 时,本行全为 ,上一行也必须全为 ,故
由 出发归纳,可以得到
$$d_{i,r}= \begin{cases} 2^{i-r-1},&0\le r<i,\\ 1,&r=i. \end{cases}$$把最后一行的所有前缀长度求和:
$$\sum_{r=0}^{k}d_{k,r} =\sum_{r=0}^{k-1}2^{k-r-1}+1 =2^k.$$所以,一个固定元素恰有 种合法出现模式。
合并所有元素
中的 个元素有标号,且每个元素的出现模式可以独立选择。一个完整方案又能唯一恢复每个元素的模式,所以根据乘法原理,方案总数为
最终对 取模。由于 ,乘积 ,必须用有符号64位整数保存指数,再执行二进制快速幂。
复杂度
时间复杂度为 ,空间复杂度为 。
部分分算法
当 时,可以不使用分布闭式,直接维护当前行各前缀长度的方案数,并以一遍后缀和完成下一行转移。总状态数为 ,空间可滚动为 。得到单元素模式总数后,再对其取 次幂。
当 时,可以使用“单元素模式数每增加一行翻倍”的递推,循环 次求出 ,再快速计算它的 次方。复杂度为 。
满分算法把两次幂直接合并为 ,避免任何关于 的线性循环。
边界与周期
- 时答案为 。
- 时只有一个任意子集,答案为 。
- 样例 时答案为 。
- 模数是质数,答案永远不为 。
- 若主动约去指数周期,应对 取模,不能对模数本身取模。
- 1
信息
- ID
- 969
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者