线上OJ:
https://www.luogu.com.cn/problem/P8814 (opens in a new tab)
https://www.acwing.com/problem/content/4732/ (opens in a new tab)
核心思想:
对本题先进行数学公式推导
已知
由于 是已知的, 令 ,可得
由 ① 式得,,
代入 ② 式得 ,即
利用一元二次方程求解公式可得,
由于题中说 为正整数,所以 必须为完全平方数,
我们令 ,如果 ,则说明 为整数,
此时 ,输出即可,否则输出NO
题解代码:
数学推导
#include <bits/stdc++.h>
#define ll long long
using namespace std;
/*
n = p*q m = n - e*d + 2
q = (m+sqrt(m*m-4*n))/2 p = (m-sqrt(m*m-4*n))/2
*/
int k; //定义正整数k
ll n, d, e; //定义n、d、e
int main()
{
cin >> k; //输入k
while (k--)
{ //循环 k次
cin >> n >> d >> e; //输入n、d、e
ll m = n - e*d + 2; //根据数学推导,计算m
ll r = sqrt(m*m - 4*n); //根据数学推导,计算m*m-4*n的平方根
if (r*r == (m*m - 4*n))
{ //因为p和q是正整数,所以这里判断是否为完全平方根
cout << (m-r)/2 << " " << (m+r)/2 << endl; //计算p和q
}
else
{
cout << "NO" << endl; //否则输出NO
}
}
return 0;
}