描述
给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni, ei, di,求两个正整数 pi, qi,使 ni = pi × qi, ei × di = (pi − 1)(qi − 1) + 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
用例输入 2
10 24568598 2 12274271 627334722 46 13636459 1498221 26 57041 568827088 89 6391288 632103400 4 158012927 256963728 1 256931611 384696951 93 4136098 1072093 17 62939 831052664 1 830997667 241254720 8 30152063
用例输出 2
NO NO NO NO 19850 31844 15088 17031 NO NO NO 7978 30240
用例输入 3
10 840072398 1 280024133 623267306 93 2233933 599266096 88 3404921 640440802 43 14892945 473333391 3 52592599 524657334 94 1860487 729896857 1 1 874546590 3 233212423 984273150 2 492134471 958063848 56 5702761
用例输出 3
NO NO 2 299633048 NO NO NO 1 729896857 5 174909318 NO NO
提示
以下记 m = n − e × d + 2。
保证对于 100% 的数据,1 ≤ k ≤ 10^5,对于任意的 1 ≤ i ≤ k,1 ≤ ni ≤ 10^18, 1 ≤ ei × di ≤ 10^18, 1 ≤ m ≤ 10^9。
测试点编号
k≤ | n ≤ | m≤ | 特殊性质 | |
---|---|---|---|---|
1 | 10^3 | 10^3 | 10^3 | 保证有解 |
2 | 10^3 | 10^3 | 10^3 | 无 |
3 | 10^3 | 10^9 | 4*10^6 | 保证有解 |
4 | 10^3 | 10^9 | 4*10^6 | 无 |
5 | 10^3 | 10^9 | 10^9 | 保证有解 |
6 | 10^3 | 10^9 | 10^9 | 无 |
7 | 10^5 | 10^18 | 10^9 | 保证若有解则p=q |
8 | 10^5 | 10^18 | 10^9 | 保证有解 |
9 | 10^5 | 10^18 | 10^9 | 无 |
10 | 10^5 | 10^18 | 10^9 | 无 |
代码如下:
//q^2+(ed-n-2)q+n==0;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll k,n,d,e;
cin>>k;
while(k--){
cin>>n>>d>>e;
ll f=e*d-n-2;
//q^2+fq+n==0
ll t=f*f-4*n;
ll t1=sqrt(t);
if(t1*t1!=t){//判断根号下的数是否为整数
cout<<"NO\n";
continue;
}
if(t1>=0){//根号下的数大于零
ll x1=(-f+t1);
ll x2=(-f-t1);
if(x1>=0&&x2>=0&&((-f+t1)%2==0)){//判断为正整数,分子的数是否为二的倍数
cout<<x2/2<<" "<<x1/2;
}else{
cout<<"NO";
}
}else{
cout<<"NO";
}
cout<<endl;
}
return 0;
}
本题其实是解一元二次方程!