C++ 算法题:求解整数对满足特定条件

题目描述

给定两个整数 SP,问是否有正整数对 (x, y),使得 x * y = S2 * (x + y) = P

如果有,则输出 Yes,并在第二行输出满足 x 最小的两个整数,否则则输出 No

输入格式

第一行两个整数 SP,中间用空格隔开。

输出格式

第一行一个字符串 YesNo,表示是否有满足条件的整数对。

如果第一行为 Yes,则在第二行输出 x 最小的这整数对,中间用空格隔开。如果第一行为 No,则没有第二行。

输入输出样例

样例 1

  • 输入样例:
12 16
  • 输出样例:
Yes
2 6

样例说明: 2 * 6 = 12, 2 * (2 + 6) = 16

样例 2

  • 输入样例:
12 1000
  • 输出样例:
No

样例说明: 可以证明没有符合条件的 (x, y),故输出 No

思路:

根据题目条件可以得到以下两个等式:

  1. x * y = S
  2. 2 * (x + y) = P

将第一个等式变形得到:

y = S / x

带入第二个等式得到:

2 * (x + S / x) = P

化简得到:

2x^2 + 2S = Px

将等式变形得到二次方程:

2x^2 - Px + 2S = 0

根据二次方程的求根公式:

x = (P ± √(P^2 - 16S)) / 4

如果 P^2 - 16S < 0,则没有满足条件的整数对。

否则,可以得到两个 x 的解,分别记为 x1x2,其中 x1 <= x2

根据 x = S / yx = x1,可以得到 y = S / x1

所以满足条件的整数对为 (x1, y1)(x2, y2)

算法步骤:

  1. 读入 SP
  2. 计算 delta = P * P - 16 * S
  3. 判断 delta 是否小于 0,若小于 0,则输出 No
  4. 计算 x1 = (P - √delta) / 4x2 = (P + √delta) / 4
  5. 计算 y1 = S / x1y2 = S / x2
  6. 输出 Yes
  7. 输出 x1y1,如果 x1 == x2,则只输出一个解。
  8. 输出 x2y2

代码示例:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int S, P;
    cin >> S >> P;

    double delta = P * P - 16 * S;

    if (delta < 0) {
        cout << 'No' << endl;
    } else {
        double x1 = (P - sqrt(delta)) / 4;
        double x2 = (P + sqrt(delta)) / 4;
        double y1 = S / x1;
        double y2 = S / x2;

        if (x1 == x2) {
            cout << 'Yes' << endl;
            cout << x1 << ' ' << y1 << endl;
        } else {
            cout << 'Yes' << endl;
            cout << x1 << ' ' << y1 << endl;
            cout << x2 << ' ' << y2 << endl;
        }
    }
    return 0;
}

注意:

  1. 代码中使用 sqrt 函数计算平方根。
  2. 输出整数对时,使用 cout 输出,并用空格隔开。
  3. 如果 x1x2 相等,则只输出一个解。
C++ 算法题:求解整数对满足特定条件

原文地址: http://www.cveoy.top/t/topic/qeI2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录