思路:
AC code:
#include <iostream>
using namespace std;
#define int long long
signed main()
{
int t;
cin >> t;
while(t--)
{
int n,d,e;
cin >> n >> d >>e ;
int t = n - e * d + 2;
int l = 1,r = t / 2 + 1;//只用到它的一半即可
bool flag = false;
while(l <= r)
{
int mid =(l+ r) >> 1;
int tt = t - mid;
if(mid *tt == n)
{
cout << mid << " " << t - mid << endl;//如果可以的话能够中途输出的
flag = true;
break;
}
if((mid) * (tt) < n)
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
if(flag)
{
continue;
}
if((l) * (t - l) == n)cout << l << " " << t - l << endl;
else cout << "NO" << endl;//判读无解
}
return 0;
}
另外一种解:

AC code:
#include <iostream>
#include <cmath>
using namespace std;
#define int long long
signed main()
{
int t;
cin >> t;
while(t--)
{
int n,d,e;
cin >> n >> d >> e;
int p = n - e * d + 2 + sqrt((n - e * d + 2) * (n - e * d + 2) - 4 * n);
int q = n - e * d + 2 - sqrt((n - e * d + 2) * (n - e * d + 2) - 4 * n);
if(p & 1 ||q & 1 || p < 0 || q < 0)//判断是不是正整数
{
cout << "NO" << endl;
}
else
{
cout << min(p / 2,q / 2) << " " << max(p / 2,q / 2) << endl;
}
}
return 0;
}
浙公网安备 33010602011771号