公式法
$$p^2+(e*d-n-2)p+n$$
一个正解为:
$$\frac{-b + \sqrt{b^2-4\times{a}\times{c}}}{2\times{a}}$$
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
int T;
cin>>T;
while(T--){
ll e,d,n;
cin>>n>>d>>e;
ll b = -(n - e*d + 2),c = n;
if(b*b < 4*c){//无解
cout<<"NO"<<endl;
}else{
ll deta = (ll)sqrt(b*b - 4*c);
ll temp = deta*deta;
if(temp == (b*b - 4*c)){
ll p = (-b + deta)/2;
ll q = n/p;
cout<<min(p,q)<<" "<<max(p,q)<<endl;
}else{
cout<<"NO"<<endl;
}
}
}
return 0;
}
二分
$$p + q = m $$
$$p\times{q} = m$$
设q为较小数,则$q\in[1,m >> 1]$,由y = x(m - x)函数可知,y在{1,m >> 1}中单调递增
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
int T;
cin>>T;
while(T--){
ll e,d,n;
cin>>n>>d>>e;
ll m = n - e*d + 2;
ll l = 1,r = m >> 1;
while(l < r){
ll mid = l + r >> 1;
if(mid * (m - mid) >= n) r = mid;
else l = mid + 1;
}
if(l * (m - l) == n){
cout<<l<<" "<<m - l<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}