1 条题解

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

    📝 题目大意

    给定两个整数 SSPP1S,P10121 \leq S, P \leq 10^{12}),判断是否存在一对正整数 (N,M)(N, M),使得 N+M=SN + M = SN×M=PN \times M = P

    💡 解题思路

    1. 题目分析:问题等价于:是否存在两个正整数,它们的和为 SS,积为 PP。从代数角度看,NNMM 是方程 x2Sx+P=0x^2 - Sx + P = 0 的两根,但这道题不需要解二次方程,直接利用因式分解关系即可。

    2. 算法推导

      • 若存在满足条件的 (N,M)(N, M),则 NNMM 必然是 PP 的两个因子(因为 N×M=PN \times M = P)。
      • 因此,只需枚举 PP 的所有因子。设 iiPP 的一个因子,则另一个因子为 j=P/ij = P / i。检查 i+j=Si + j = S 是否成立即可。
      • 枚举时只需遍历 ii11P\sqrt{P}(因为因子成对出现,i×j=Pi \times j = P 意味着 iPi \leq \sqrt{P}jPj \leq \sqrt{P})。对于每个 ii,若 Pmodi=0P \bmod i = 0,则检查 i+P/ii + P/i 是否等于 SS
      • 该做法与 std.cpp 完全一致:用 s 存储 SS,用 d 存储 PP,循环 for(int i=1;i*i<=d;i++) 枚举因子,判断 i + d/i == s
    3. 边界与细节

      • 数据类型S,PS, P 最大可达 101210^{12}i + d/i 的结果也在 long long 范围内,但使用 32 位 int 会溢出。std.cpp 使用 #define int long longint 提升为 64 位,避免溢出。
      • 循环上限1012=106\sqrt{10^{12}} = 10^6,循环次数最多 10610^6,完全在时限内。
      • 正整数约束ii11 开始枚举,P/iP/i 也是正整数,自然满足 N,MN, M 为正整数的要求。
      • 特殊数据:当 S=2,P=1S = 2, P = 1 时,i=1i=11+1/1=2=S1+1/1=2=S,输出 YesN=M=1N=M=1)。当 S=1,P=1S = 1, P = 1 时,1+1=211+1=2 \neq 1,输出 No

    ⏱️ 复杂度分析

    • 时间复杂度O(P)O(\sqrt{P})。枚举 11P\sqrt{P} 的所有整数,每次检查 PmodiP \bmod i 和加法均为 O(1)O(1)。最坏情况下 P=1012P = 10^{12},约 10610^6 次迭代,完全可行。
    • 空间复杂度O(1)O(1)。仅使用常数个变量 s,d,is, d, i,无需额外数组。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    #define int long long   // 将 int 提升为 long long,防止 10^12 范围内溢出
    using namespace std;
    int s, d, T = 1;       // s 对应 S,d 对应 P,T 为测试用例数(固定为 1)
    signed main() {
        while (T--) {
            cin >> s >> d;
            // 枚举 P 的所有因子,只需遍历到 sqrt(P)
            for (int i = 1; i * i <= d; i++) {
                if (d % i == 0) {               // i 是 d 的一个因子
                    if (i + d / i == s) {       // 检查因子对之和是否等于 S
                        cout << "Yes";
                        return 0;
                    }
                }
            }
            cout << "No";
        }
        return 0;
    }
    
    • 1

    信息

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