1 条题解
-
0
思路与算法
由两方程推出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