题目链接:https://www.luogu.com.cn/problem/P8814
题目描述
给定一个正整数 k,有 k 次询问,每次给定三个正整数 ,求两个正整数 ,使 。
输入格式
第一行一个正整数 k,表示有 k 次询问。
接下来 k 行,第 i 行三个正整数 。
输出格式
输出 k 行,每行两个正整数 表示答案。
为使输出统一,你应当保证 。
如果无解,请输出 NO。
输入输出样例
输入1
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
输出1
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88
其他样例请见附件。
数据范围
以下记 m=n−e×d+2。
保证对于 100%的数据,1≤k≤,对于任意的 1≤i≤k,1≤≤,1≤≤ ,1≤m≤。
附件下载
https://www.luogu.com.cn/fe/api/problem/downloadAttachment/h1wkwfym
思路
两个式子可得p+q=n+2-e*d,即m=n−e×d+2,而p*d=n,可知,则可得出p和q。
判断有无解,从n,e,d,p,q都是正整数出发,则需判断m与t的大小,要满足 ,根号里面是完全平方数,分子能被2整除。
不满足的条件:
t*t!= m*m-4*n||(m-t)%2!=0||m<=t
数有比较大的,用long long int 数据类型。
解题代码
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
int main() {
int k;
ll n, e, d;
ll m,t;
ll p, q;
cin >> k;
for (int i = 0; i < k; i++)
{
cin >> n >> d >> e;
m = n - e * d + 2;
t = sqrt(m * m - 4 * n);
p = (m - t) / 2;
q = (m + t) / 2;
if (t*t!= m*m-4*n||(m-t)%2!=0||m<=t)
cout << "NO" << endl;
else
cout << p << " " << q << endl;
}
return 0;
}
提示
多运用数学的思想来简化题目: 知a+b,ab,易得出a-b,进而得出a,b。