1 条题解
-
0
题解
思路
系数为零的项不会改变等式右侧,因此可以忽略。若所有系数都为零,那么只有 可表示;由于本题 ,答案为 。
下面设最小的正系数为 。如果某个数 可表示,那么 也都可表示。因此,对每个模 的余数,只需知道该余数下最小的可表示数。
子任务 1
此时 。可以逐个枚举 ,再递归枚举每个系数使用多少次,判断是否能恰好组成 。范围很小,搜索量可以直接承受。
子任务 2
此时 。建立布尔数组表示每个不超过 的数是否可表示,从 开始进行完全背包转移。最后统计区间 中的可达位置。
时间复杂度为 ,空间复杂度为 。
做法
把每个余数 看作一个点。对于每个正系数 ,从余数 向 连一条长度为 的边。
从余数 出发走过若干条边,路径长度正好是所选系数之和。因此,从 到余数 的最短路长度 ,就是所有模 余 的可表示数中的最小值。边权非负,可以用 Dijkstra 算法求出全部 。
设 表示 中可表示数的个数。若 ,则余数 对答案的贡献为
对所有余数求和即可得到 ,最终答案是 。
复杂度
满分算法的时间复杂度为 ,空间复杂度为 ,其中 是最小正系数。
正确性说明
余数图中的任意一条从 出发的路径,都对应选择若干个系数,其路径长度就是一个可表示数;反之,任意一种非负整数解都可以按使用次数排列成一条对应路径。因此最短路 恰好是余数 下最小的可表示数。
又因为 本身是一个可用系数,所以同一余数下从 开始、每增加 得到的数全部可表示;比 小的同余数没有可表示数。计数公式覆盖且仅覆盖所有可表示数,区间差分因此得到正确答案。
- 1
信息
- ID
- 903
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者