code
#include<bits/stdc++.h>
using namespace std;
int t;
long double n,e,d,p,q;
int main(){
cin>>t;
for(int i=1;i<=t;++i){
cin>>n>>e>>d;
if(n<e*d){
cout<<"NO"<<endl;
continue;
}
double dif=n-(e*d)+2,yi=1;
double ans=(dif-sqrt((dif)*(dif)-(4*n)))/2;
if(ans>dif-ans) ans=dif-ans;
long long t1=ans,t2=dif-ans;//用的是转整数判断是否正确
if(t1*t2==n && (t1-1)*(t2-1)+1==e*d) cout<<t1<<" "<<t2<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
具体推柿子的过程:
(p−1)×(q−1)+1
=q(p−1)−(p−1)+1
=pq−q−p+2
得:
n−ed=pq−(pq−q−p+2)=p+q+2
设 dif 为 n−ed+2,也就是 p+q
p2+q2=(p+q)2−2pq
代入:p−q=p2−2pq+q2 得:
p−q=(p+q)2−4pq
得 q 为 2(p+q)2−4pq−p−q
也就是 2dif2−4n−dif
刚学二次方程,考场上没推出来柿子,打的暴力