1 条题解

  • 0
    @ 2026-10-26 22:20:37

    思路与算法

    由两方程推出p+q=n-ed+2,二分整数平方根验证判别式为非负完全平方且同奇偶,再排序输出;128位中间判别式。

    按上述模型建立状态或枚举对象,依代码中的顺序处理输入并输出完整答案。

    正确性说明

    展开ed=(p-1)(q-1)+1并代入pq=n,得到p+q=n-ed+2。二次方程两根为(s±sqrt(s²-4n))/2;非负完全平方判别式、同奇偶和正根是正整数解的充要条件。

    复杂度

    每询问O(log m)时间、O(1)额外空间,k询问串行处理。

    易错点

    输入顺序为n,d,e;不使用浮点sqrt直接判断完全平方。判别式为负须先处理。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        int k;
        cin >> k;
        while (k--) {
            long long n, d, e;
            cin >> n >> d >> e;
            long long s = n - d * e + 2;
            __int128 z = (__int128)s * s - (__int128)4 * n;
            if (z < 0) {
                cout << "NO\n";
                continue;
            }
            long long lo = 0, hi = s;
            while (lo < hi) {
                long long mid = (lo + hi + 1) / 2;
                if ((__int128)mid * mid <= z)
                    lo = mid;
                else
                    hi = mid - 1;
            }
            if ((__int128)lo * lo != z || (s - lo) % 2 || s <= lo)
                cout << "NO\n";
            else
                cout << (s - lo) / 2 << ' ' << (s + lo) / 2 << "\n";
        }
    }
    
    • 1

    信息

    ID
    1896
    时间
    1000ms
    内存
    512MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者