1 条题解

  • 0
    @ 2026-6-19 10:31:09

    📝 题目大意

    给定两个正整数 AABB(均 <108< 10^8),构造一个 <1018< 10^{18} 的正整数 xx,使得 xx 的十进制表示中出现 AA 作为连续子串,且 2x2x 的十进制表示中出现 BB 作为连续子串。

    💡 解题思路

    1. 题目分析:题目要求构造一个满足两个子串条件的数,而非寻找最小解或判定是否存在。数据范围 A,B<108A, B < 10^8 以及 x<1018x < 10^{18} 的宽松限制提示我们可以采用"拼接"的方式构造,将 AABB 的信息分别嵌入 xx 的不同位置。

    2. 算法推导

      • 为了让 xx 中出现 AA,最直接的方式是让 xx AA 结尾,即 x=prefix×10len(A)+Ax = \text{prefix} \times 10^{len(A)} + A
      • 接下来需要让 2x2x 中出现 BB。计算 2x2x:$$2x = 2 \times (\text{prefix} \times 10^{len(A)} + A) = (2 \times \text{prefix}) \times 10^{len(A)} + 2A$$
      • 我们希望 2x2x 的十进制表示以 BB 开头,这样 BB 就自然作为子串出现。令 2×prefix=B2 \times \text{prefix} = B,即 prefix=B2\text{prefix} = \dfrac{B}{2}。但 BB 可能是奇数,B2\dfrac{B}{2} 不一定是整数。
      • 为了解决整除问题,将式子两边同时乘以 1010:我们希望 2x2x 的十进制表示中,BB 出现在最前面。考虑 x=(B×5)×10len(A)+Ax = (B \times 5) \times 10^{len(A)} + A,即 xxB×5B \times 5 的十进制表示与 AA 的十进制表示拼接而成。
      • 验证:此时 $2x = 2 \times (B \times 5 \times 10^{len(A)} + A) = B \times 10^{len(A)+1} + 2A$。
      • 由于 A<108A < 10^82A<2×1082A < 2 \times 10^8,最多 99 位数。而 B×10len(A)+1B \times 10^{len(A)+1} 末尾至少有 22 个零(len(A)1len(A) \geq 1),2A2A 的加入不会产生进位影响到 BB 的高位数字,因此 2x2x 的十进制表示前缀就是 BBBB 作为子串出现在 2x2x 中。
      • 同时 xxAA 结尾,AA 也作为子串出现在 xx 中。
      • 关于 x<1018x < 10^{18} 的限制:B×5<5×108B \times 5 < 5 \times 10^8(最多 99 位),A<108A < 10^8(最多 88 位),拼接后最多 1717 位,远小于 101810^{18}
    3. 边界与细节

      • 注意 BBAA 的输入是整数,直接使用 printf("%d%d", b*5, a) 拼接输出即可,无需处理前导零(题目保证 AABB 开头无多余 00)。
      • 无需特判 AABB 的边界值,构造公式对所有合法输入均成立。
      • 该构造并非唯一解,题目只要求输出任意一个满足条件的 xx

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1)。仅做一次整数乘法和输出。
    • 空间复杂度O(1)O(1)。仅使用常数个变量。

    💻 标准代码 (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;
    }
    
    • 1

    信息

    ID
    872
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者