1 条题解
-
0
B. 大数加法 – 详细题解
问题重述
给定一个整数 (),判断是否存在两个位数相同的大整数 和 ,使得 。
大整数定义为:其每一位数字都在 到 之间(包含端点)。关键观察
设 和 的位数为 。那么它们每一位上的数字 ,且 和 的长度相同。
两个 位数相加,和可能是一位 位数,也可能是 位数(当最高位的和加上进位达到 或以上时)。
因此可能的位数情况有两种:- 和 恰好有 位(即没有额外的进位溢出);
- 和 有 位(最高位只能为 ,因为两个最多 的数字相加再加进位最多 )。
所以对于给定的 ,我们只需检查两种可能的位数: 和 (当 时)。
如果其中一种情况可行,则答案为YES,否则为NO。数位处理与进位约束
从低位到高位逐位判断是否存在合法的 以及进位值。
设 为 从低位开始第 位上的数字( 表示个位)。
设进位数 表示第 位相加后产生的进位(),其中 (最低位无进位输入)。
对于第 位(),我们有:[ a_i + b_i + c_i = d_i + 10 \cdot c_{i+1} ]
其中 表示向高位的进位( 或 )。
已知 ,因此 。等式分析
给定 和 ,我们需要判断是否存在 以及 使得上式成立。
因为 。- 当 时,,必须 且 。
- 当 时,,也必须 且 。
同时注意 和 均为正整数(因为 ,且最低位 来自 的个位,可能为 ,但需保证最终和为正整数)。
更简单的判定方式是:
对于给定的 和 ,可能的进位输出 必须满足:[ 10 \le d_i + 10c_{i+1} - c_i \le 18 ]
即差值落在 。
若存在 满足该不等式,则这一位可行,并可将 作为下一位置的进位输入。因此我们可以从最低位开始,维护当前可能的进位值集合 中哪些是可行的,然后逐位转移。
最终处理完所有 位后,需检查最终的进位 是否满足长度要求:- 如果 的位数等于 (即没有最高进位),则必须有 ;
- 如果 的位数等于 (存在额外进位),则必须有 ,并且此时 的最高位必须为 (因为两个 位数相加,最高位产生进位 ,且不会超过 )。
算法步骤
对于给定的 :
- 提取其十进制数字串 (高位到低位)。
- 分别尝试两种长度情况:
- 情况 A:,要求最终进位 。
- 情况 B:(当 时),要求最终进位 ,并且 的最高位必须为 (因为进位得到的最高位只能是 )。
- 对于每种情况,进行从低位到高位的进位状态模拟:
- 初始进位集合 。
- 对于第 位(),取 的对应位数字 (低位对齐,不足的高位补 或直接忽略)。
- 对于当前 中的每个值 ,检查是否可以为 或 ,使得 。将可行的 加入新的集合。
- 若某一步集合为空,则该情况不可行。
- 若任一情况成功,输出
YES,否则NO。
时间复杂度
每个测试用例处理 位,,且常数极小,可在 秒内轻松处理 个测试用例。
正确性说明
该算法本质上是确定性有限自动机 (进位作为状态)的可行性判定。由于每位只有 或 两种进位输入,且转移规则完全由 决定,因此通过逐位检查即可确定是否存在满足条件的 。
注意:我们不需要显式求出 ,只需存在性。同时,由于 的范围连续且转移条件简单,没有必要枚举具体数值,只需验证进位转移的可能性。
示例验证
- :位数 ,尝试 。低位到高位模拟可行,最终进位为 ,成功(如 )。
- :位数 ,尝试 :最低位 ,只能取 (因为 在 )。继续模拟至高位,发现无法满足,再尝试 (即看作 ? 实际 时, 应有 位,所以最高位是进位得到的 ,但 的最高位是 ,矛盾),所以无解。
- :位数 。尝试 :个位 ,, 得 。十位 ,,需 ,若 得 ;若 得 可行,但最终进位 要求 时最高位由进位产生,但 的十位是 不是 ,矛盾。所以 。
结论
本题通过分析进位规律,使用简单的数位 DP(状态数仅为 )即可高效求解,无需复杂的高精度运算。代码实现时注意字符串的索引转换和边界情况即可。
- 1
信息
- ID
- 6939
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者