[2022CSP-J]解密

阅读量: 96 编辑

给定一个正整数 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;
}
爱码岛编程公众号
试卷资料
爱码岛编程小程序
在线刷题
苏ICP备13052010号
©2023 南京匠成信息科技有限公司