我这个是用解二次方程的出的,不知道为什么只A了前两个点
#include<iostream>
#include<cmath>
using namespace std;
long long k,n,q,p,e,d;
int can(long long x){
int s=floor(sqrt(x));
if(s*s==x){
return 1;
}else{
return 0;
}
}
int main(){
ios::sync_with_stdio(false),cin.tie(),cout.tie();
cin>>k;
while(k--){
cin>>n>>d>>e;
//不行的暴力60
// for(int i=1;i<=sqrt(n);i++){
// if(n%i==0){
// p=i;
// q=n/i;
// if(e*d==(n-p-q+2)){
// cout<<p<<" "<<q<<endl;
// flag=1;
// break;
// }
// }
// }
//二分
// long long flag=0,m=n-e*d+2,left=1,right=m/2;
// while(left<=right){
// long long mid=(left+right)/2;
// if(mid*(m-mid)==n){
// cout<<mid<<" "<<m-mid<<endl;
// flag=1;
// break;
// }else if(mid*(m-mid)<n){
// left=mid+1;
// }else{
// right=mid-1;
// }
// }
long long flag=0,m=n-e*d+2,derta=m*m-4*n;//pq=n p+q=n-ed+2 q^2-mq+n=0
if(derta<0){
cout<<"NO\n";
continue;
}
if(can(derta)){
// cout<<m*m-4*n<<"can be sqrt\n";
if((m*m-derta)%2==0){//p
cout<<(m-sqrt(derta))/2<<" ";
flag=1;
}
if((m*m+derta)%2==0){//q
cout<<(m+sqrt(derta))/2<<endl;
flag=1;
}
}
if(!flag){
cout<<"NO\n";
}
}
return 0;
}
/*
in
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
out
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88
*/