如果你用的是二分法,那一定要判上 l==r 的情况(即p==q),我是出来的时候判了一下,结果没发现p和q没更新挂大分。
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
ll K, n, e, d, p, q, m;
int main(){
ll l, r, flag;
scanf("%lld", &K);
while(K--){
scanf("%lld%lld%lld", &n, &d, &e);
m = n - e * d + 2, flag = 0;
l = 1, r = m >> 1, q = m - 1;
if(r * (m - r) < n || m - 1 > n){ printf("NO\n"); continue;}
while(l <= r){
p = (l + r) >> 1, q = m - p;
if(p * q == n){ flag = 1; break;}
if(p * q < n) l = p + 1;
else r = p - 1;
}
if(p * q == n) flag = 1;
if(!flag) printf("NO\n");
else printf("%lld %lld\n", p, q);
}
return 0;
}