这道题CCF还是放了很多水分在里面;首先看数据范围:
以下记 m = n − e × d + 2 m = n - e \times d + 2 m=n−e×d+2
是不是很熟悉?是的,这题CCF贴心提示我们用韦达定理和求根公式;
首先,对
e
i
×
d
i
e_i \times d_i
ei×di进行化简:
e
i
×
d
i
=
(
p
i
−
1
)
(
q
i
−
1
)
+
1
=
p
i
×
q
i
−
(
p
i
+
q
i
)
+
2
=
n
i
−
(
p
i
+
q
i
)
+
2
e_i \times d_i =(p_i-1)(q_i-1)+1 \\ =p_i \times q_i -(p_i+q_i)+2 \\ =n_i-(p_i+q_i)+2
ei×di=(pi−1)(qi−1)+1=pi×qi−(pi+qi)+2=ni−(pi+qi)+2
因此,移项可得:
{
p
i
+
q
i
=
n
i
+
2
−
e
i
×
d
i
=
−
b
a
p
i
×
q
i
=
n
i
=
c
a
\left\{
我们可以构造方程:
a
x
2
+
b
x
+
c
=
0
ax^2+bx+c=0
ax2+bx+c=0
即: x 2 + ( e i × d i − n i − 2 ) x + n = 0 x^2+(e_i \times d_i-n_i-2)x + n=0 x2+(ei×di−ni−2)x+n=0
根据求根公式,有: Δ = b 2 − 4 a c = ( e i × d i − n i − 2 ) 2 − 4 × 1 × n i = ( e i × d i − n i − 2 ) 2 − 4 × n i ( Δ ≥ 0 ) \Delta = b^2-4ac = (e_i \times d_i-n_i-2)^2-4 \times 1 \times n_i =(e_i \times d_i-n_i-2)^2 - 4 \times n_i (\Delta \ge 0) Δ=b2−4ac=(ei×di−ni−2)2−4×1×ni=(ei×di−ni−2)2−4×ni(Δ≥0)
所以,有:
q i / p i = − b ± b 2 − 4 a c 2 a = − ( e i × d i − n i − 2 ) ± ( e i × d i − n i − 2 ) 2 − 4 × n i 2 q_i / p_i={\small{-b \pm \sqrt{b^2-4ac}\over 2a}}= {\small \frac{-(e_i \times d_i-n_i-2) \pm \sqrt{(e_i \times d_i-n_i-2)^2 - 4 \times n_i} }{2}} qi/pi=2a−b±b2−4ac=2−(ei×di−ni−2)±(ei×di−ni−2)2−4×ni
最后输出即可;但是要注意 q i p i q_ip_i qipi均为整数!
#include
using namespace std;
long long k,n,e,d;
long long b,c,drt;
long long x,y;
int main(){
scanf("%lld",&k);
while(k--){
scanf("%lld%lld%lld",&n,&e,&d);
c=n;
b=e*d-n-2;
drt=b*b-c-c-c-c;
if(drt<0){
printf("NO\n");continue;
}
if(sqrt(drt)*sqrt(drt)!=drt){
printf("NO\n");continue;
}
drt=sqrt(drt);
if((-b+drt)%2==1){
printf("NO\n");continue;
}
x=(-b+drt)/2;
y=(-b-drt)/2;
if(x<=0||y<=0){
printf("NO\n");continue;
}
printf("%lld %lld\n",y,x);
}
return 0;
}