1 条题解

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

    📝 题目大意

    给定整数 NN,判断是否存在正整数 A,BA, B 使得 3A+5B=N3^A + 5^B = N。若存在输出任意一组 (A,B)(A, B),否则输出 1-1

    💡 解题思路

    1. 题目分析NN 上限为 101810^{18},而 3A3^A5B5^B 均是指数增长,因此 AABB 的取值上限非常小。具体地,3381.35×10183^{38} \approx 1.35 \times 10^{18}5261.49×10185^{26} \approx 1.49 \times 10^{18},所以 A38A \leq 38B26B \leq 26。这意味着我们可以暴力枚举其中一个变量,再用哈希表快速查询另一个变量是否存在。

    2. 算法推导

      • 首先预处理出所有不超过 NN55 的幂 5B5^BB1B \geq 1),将它们存入哈希表 mp,键为 5B5^B 的值,值为对应的指数 BB
      • 然后枚举 AAA1A \geq 1),计算 3A3^A,并检查 N3AN - 3^A 是否在哈希表中。若存在,则找到一组解 (A,B)(A, B),直接输出并结束程序。
      • 这本质上是"枚举一个维度 + 哈希表查另一个维度"的双指针/预处理优化思路,将 Θ(Amax×Bmax)\Theta(A_{\max} \times B_{\max}) 的双重循环降为 Θ(Amax+Bmax)\Theta(A_{\max} + B_{\max})
      • 代码中 mp 存储 5^B → B 的映射,while (mul * 5 <= n) 循环逐次生成 51,52,5^1, 5^2, \dots;同理,第二个 while (mul * 3 <= n) 枚举 31,32,3^1, 3^2, \dots,每次用 mp.count(n - mul) 判断差值是否为 55 的幂。
    3. 边界与细节

      • AABB 均为正整数A1,B1A \geq 1, B \geq 1),因此代码中 cnt 初始为 00,先 cnt++mul *= 3/5,确保从 313^1515^1 开始枚举。
      • NN 较小时(如 N=1N=1),两个 while 循环均不会进入,mp 为空,程序直接输出 1-1,这是正确的。
      • 使用 long long 避免中间计算溢出,3383^{38}5265^{26} 均在 long long 范围内。

    ⏱️ 复杂度分析

    • 时间复杂度:预处理 55 的幂需要 Θ(log5N)\Theta(\log_5 N) 次迭代,枚举 33 的幂需要 Θ(log3N)\Theta(\log_3 N) 次迭代,每次哈希表查询为 O(1)O(1)。总时间复杂度为 O(logN)O(\log N)
    • 空间复杂度:哈希表 mp 存储最多 log5N\log_5 N 个键值对,空间复杂度为 O(logN)O(\log N)

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    using LL = long long;
    LL n;
    // mp: 存储 5^B -> B 的映射
    map<LL, int> mp;
    int main(){
    	cin >> n;
    	// 预处理所有不超过 n 的 5 的幂
    	int cnt = 0;
    	LL mul = 1;
    	while (mul * 5 <= n){
    		cnt++;         // B 从 1 开始
    		mul *= 5;      // mul = 5^cnt
    		mp[mul] = cnt; // 记录 5^cnt 对应的指数
    	}
    	// 枚举 3^A,检查 n - 3^A 是否为 5 的幂
    	mul = 1, cnt = 0;
    	while (mul * 3 <= n){
    		cnt++;         // A 从 1 开始
    		mul *= 3;      // mul = 3^cnt
    		if (mp.count(n - mul)){ // 差值 n - 3^A 是 5 的某次幂
    			cout << cnt << ' ' << mp[n - mul] << '\n';
    			return 0;
    		}
    	}
    	// 无解
    	cout << "-1\n";
    	return 0;
    }
    
    • 1

    信息

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