一直 WA60,就是过不了 QAQ
我的代码:
/*
已知:n,e,d 求:p,q
n=pq
ed=(p-1)(q-1)+1
ed=pq-(p+q)+2
p+q=n-ed+2
=> q=n-ed+2-p
n=p(n-ed+2-p)
=> -p^2+(n-ed+2)p-n=0
*/
#include <cstdio>
#include <cmath>
#define min(a, b) (a < b ? a : b)
#define ll long long
const double INF = 2e9 + 0.114514;
ll n;
bool check (ll a, ll b, ll c, double x) { return a*x*x + b*x + c == 0; }
void F (ll a, ll b, ll c) {
double d = b * b - 4.0 * a * c;
if (d < 0) {
puts("NO");
return ;
}
d = sqrt(d);
if (d != (ll)d) {
puts("NO");
return ;
}
double p1 = (-b + d) / (2.0 * a);
double p2 = (-b - d) / (2.0 * a);
if (p1 != (ll)p1/* || !check(a, b, c, p1)*/) p1 = INF;
if (p2 != (ll)p2/* || !check(a, b, c, p2)*/) p2 = INF;
double p = min(p1, p2);
if (p == (ll)p) {
printf("%.0lf %.0lf\n", p, n / p);
return ;
}
puts("NO");
return ;
}
ll E, D;
int main () {
// freopen("decode.in", "r", stdin);
// freopen("decode.out", "w", stdout);
int T;
scanf("%d", &T);
while (T--) {
scanf("%lld%lld%lld", &n, &E, &D);
F(-1, n - E * D + 2, -n);
}
return 0;
}