1 条题解
-
0
📝 题目大意
给定两个正整数 和 (均 ),构造一个 的正整数 ,使得 的十进制表示中出现 作为连续子串,且 的十进制表示中出现 作为连续子串。
💡 解题思路
-
题目分析:题目要求构造一个满足两个子串条件的数,而非寻找最小解或判定是否存在。数据范围 以及 的宽松限制提示我们可以采用"拼接"的方式构造,将 和 的信息分别嵌入 的不同位置。
-
算法推导:
- 为了让 中出现 ,最直接的方式是让 以 结尾,即 。
- 接下来需要让 中出现 。计算 :$$2x = 2 \times (\text{prefix} \times 10^{len(A)} + A) = (2 \times \text{prefix}) \times 10^{len(A)} + 2A$$
- 我们希望 的十进制表示以 开头,这样 就自然作为子串出现。令 ,即 。但 可能是奇数, 不一定是整数。
- 为了解决整除问题,将式子两边同时乘以 :我们希望 的十进制表示中, 出现在最前面。考虑 ,即 由 的十进制表示与 的十进制表示拼接而成。
- 验证:此时 $2x = 2 \times (B \times 5 \times 10^{len(A)} + A) = B \times 10^{len(A)+1} + 2A$。
- 由于 ,,最多 位数。而 末尾至少有 个零(), 的加入不会产生进位影响到 的高位数字,因此 的十进制表示前缀就是 , 作为子串出现在 中。
- 同时 以 结尾, 也作为子串出现在 中。
- 关于 的限制:(最多 位),(最多 位),拼接后最多 位,远小于 。
-
边界与细节:
- 注意 和 的输入是整数,直接使用
printf("%d%d", b*5, a)拼接输出即可,无需处理前导零(题目保证 、 开头无多余 )。 - 无需特判 或 的边界值,构造公式对所有合法输入均成立。
- 该构造并非唯一解,题目只要求输出任意一个满足条件的 。
- 注意 和 的输入是整数,直接使用
⏱️ 复杂度分析
- 时间复杂度:。仅做一次整数乘法和输出。
- 空间复杂度:。仅使用常数个变量。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main() { int a, b; scanf("%d%d", &a, &b); // 核心构造:将 B*5 与 A 的十进制表示直接拼接 // x = B*5 后接 A → x 以 A 结尾,2x 以 B 开头 printf("%d%d\n", b * 5, a); return 0; } -
信息
- ID
- 872
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者