0 好办,我们只需要算出 p 和 q 之后特判就可以了。对于小数和无理数,我们可以先用 long long 强制转换,舍弃小数点后带入题目给出的两个式子,检验解是否正确。对于虚数,函数 sqrt 的被开方数为负数的时候会返回 NaN,用 long long 储存 NaN 时值为 0,和我们处理 P = 0 时思路一样。如果解符合上述条件,那么一定是整数,也就是符合题目要求的解。
//
// main.cpp
// P8814 [CSP-J 2022] 解密(民间数据)
//
// Created by SkyWave Sun on 2022/11/7.
//
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
long long k;
scanf("%lld",&k);
while (k--) {
long long n,e,d;
scanf("%lld%lld%lld",&n,&e,&d);
long long PsubQ = sqrt((n - e * d + 2) * (n - e * d + 2) - (n * 4));
long long PaddQ = n - e * d + 2;
long long P = (PsubQ + PaddQ) / 2;
long long Q = PaddQ - P;
if (P * Q == n && e * d == (P - 1) * (Q - 1) + 1 && P && Q) {
printf("%lld %lld\n",min(P, Q),max(P, Q));
}else {
printf("NO\n");
}
}
return 0;
}