给定一个正整数 k,有 k 次询问,每次给定三个正整数 nᵢ, eᵢ, dᵢ,求两个正整数 pᵢ, qᵢ,使:
nᵢ = pᵢ × qᵢ
eᵢ × dᵢ = (pᵢ − 1)(qᵢ − 1) + 1。
【输入格式】
第一行一个正整数 k,表示有 k 次询问。
接下来 k 行,第 i 行三个正整数 nᵢ, eᵢ, dᵢ。
【输出格式】
输出 k 行,每行两个正整数 pᵢ, qᵢ 表示答案。
为使输出统一,你应当保证 pᵢ ≤ qᵢ。
如果无解,请输出 NO。
【输入样例】
10
770 77 5
633 1 211
545 1 499
683 3 227
858 3 257
723 37 13
572 26 11
867 17 17
829 3 263
528 4 109
【输出样例】
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88
【参考程序】
// 爱码岛编程(解法一)(P8814)
#include <bits/stdc++.h>
using namespace std;
long long k, n, e, d;
int main() {
cin >> k;
while (k--) {
cin >> n >> d >> e;
long long s = n - e * d + 2;
long long t = s * s - 4 * n;
long long w = sqrt(t);
if (w * w == t) {
long long q = (s + w) / 2;
long long p = s - q;
cout << p << " " << q << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}
【参考程序】
// 爱码岛编程(解法二)
#include <bits/stdc++.h>
using namespace std;
long long k, n, d, e;
int main() {
cin >> k;
while (k--) {
cin >> n >> d >> e;
long long s = n - d * e + 2;
long long R = sqrt(n), L = 1;
while (L < R) {
int mid = (L + R) / 2;
if (mid * (s - mid) < n) {
L = mid + 1;
} else {
R = mid;
}
}
if (L * (s - L) == n) {
cout << L << " " << s - L << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}