代码:
/*
题目解析
给定一个正整数 k
有k 次询问,每次给定三个正整数ni,di,ei
求两个正整数 pi,qi使
ni=pi*qi
ei*di=(pi-1)*(qi-1)
输入格式
第一行一个正整数k,表示有 k 次询问。
接下来 k 行,第 i 行三个正整数ni,di,ei
输出格式
输出
k 行,每行两个正整数
pi,qi表示答案。
为使输出统一,你应当保证 pi<=qi
如果无解,请输出 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
*/
#include <bits/stdc++.h>
using namespace std;
int main()
{
int k,n,d,e;
cin>>k;
for(int i=0;i<k;i++)
{
scanf("%d%d%d",&n,&d,&e);//输入数据
/*
根据题意
n-de+2=p+q
n=pq
化简得
q,p为方程x2+(de-n-2)x+n两根
*/
//解方程{
int a=n-d*e+2;
int delta=a*a-(n<<4);//快一点
if(delta<0)printf("NO\n");
else if(fabs(floor(sqrt(delta))*floor(sqrt(delta))-delta)>=1e-5)printf("NO\n");
else if(int(a-round(sqrt(delta)))%2)printf("NO\n");
else
{
float p=a;
float q=round(sqrt(delta));
printf("%d %d\n",(p-q)/2,(p+q)/2);
}
//}
}
return 0;
}