#CSPJ202303. 一元二次方程

一元二次方程

题目背景

众所周知,对一元二次方程ax2+bx+c=0,(a0)ax^2+bx+c=0,(a\ne0),可以用以下方式求实数解:

  • 计算Δ=b24ac\Delta=b^2-4ac,则
    1. Δ<0\Delta<0,则该一元二次方程无实数解。
    2. 否则Δ0\Delta\geq 0,此时该一元二次方程有两个实数解x1,2=b+Δ2ax_{1,2}=\frac{-b+\sqrt{\Delta}}{2a}

例如:

  • x2+x+1=0x^2+x+1=0无实数解,因为Δ=12411=3<0\Delta=1^2-4*1*1=-3<0
  • x22x+1=0x^2-2x+1=0有两相等实数解x1,2=1x_{1,2}=1
  • x23x+2=0x^2-3x+2=0有两互异实数解x1=1,x2=2x_1=1,x_2=2

在题面描述中aabb的最大公因数使用gcd(a,b)gcd(a,b)表示。例如12121818的最大公因数是66,即gcd(12,18)=6gcd(12,18)=6

题目描述

现在给定一个一元二次方程的系数a,b,ca,b,c,其中a,b,ca,b,c均为整数且a0a\ne0。你需要判断一元二次方程ax2+bx+c=0ax^2+bx+c=0是否有实数解,并按要求的格式输出。

在本题中输出有理数vv时须遵循以下规则:

  • 由有理数的定义,存在唯一的两个整数ppqq,满足q>0q>0gcd(p,q)=1gcd(p,q)=1v=pqv=\frac{p}{q}
  • q=1q=1,则输出{p},否则输出{p}/{q},其中{n}代表整数nn的值。
  • 例如:
    • v=0.5v=-0.5时,ppqq的值分别为1-122,则应输出-1/2
    • v=0v=0时,ppqq的值分别为0011,则应输出0

对于方程的求解,分两种情况讨论:

  1. Δ=b24ac<0\Delta=b^2-4ac<0,则表明方程无实数解,此时你应当输出NO

  2. 否则Δ0\Delta\geq 0,此时方程有两解(可能相等),记其中较大者为xx,则:

    1. xx为有理数,则按有理数的格式输出xx
    2. 否则根据上文公式,xx可以被唯一表示为x=q1+q2rx=q_1+q_2\sqrt{r}的形式,其中:
      • q1,q2q_1,q_2为有理数,且q2>0q_2>0
      • rr为正整数且r>1r>1,且不存在正整数d>1d>1使d2rd^2|r(即rr不应是d2d^2的倍数);

    此时:

    1. q10q_1\ne0,则按有理数的格式输出q1q_1,并再输出一个加号+
    2. 否则跳过这一步输出;

    随后:

    1. q2=1q_2=1,则输出sqrt({r})
    2. 否则若q2q_2为整数,则输出{q2}*sqrt({r})
    3. 否则若q3=1q2q_3=\frac{1}{q_2}为整数,则输出sqrt({r})/{q3}
    4. 否则可以证明存在唯一整数c,dc,d满足c,d>1,gcd(c,d)=1c,d>1,gcd(c,d)=1q2=cdq_2=\frac{c}{d},此时输出{c}*sqrt({r})/{d}

    上述表示中{n}代表整数{n}的值,详见样例。

    如果方程有实数解,则按要求的格式输出两个实数解中的较大者。否则若方程没有实数解,则输出NO

输入格式

输入的第一行包含两个正整数T,MT,M,分别表示方程数和系数的绝对值上限。

接下来TT行,每行包含三个整数a,b,ca,b,c

输出格式

输出TT行,每行包含一个字符串,表示对应询问的答案,格式如题面所述。

每行输出的字符串中间不应包含任何空格。

输入输出样例

9 1000
1 -1 0
-1 -1 -1
1 -2 1
1 5 4
4 4 1
1 0 -432
1 -3 1
2 -4 1
1 7 1
1
NO
1
-1
-1/2
12*sqrt(3)
3/2+sqrt(5)/2
1+sqrt(2)/2
-7/2+3*sqrt(5)/2

数据规模与约定

对于所有数据有:1T50001\leq T\leq50001M1031\leq M\leq10^3a,b,cM|a|,|b|,|c|\leq Ma0a\ne0

测试点编号 MM\leq 特殊性质A 特殊性质B 特殊性质C
11 11
22 2020
33 10310^3
44
55
66
7,87,8
9,109,10

其中:

  • 特殊性质 A:保证b=0b=0
  • 特殊性质 B:保证c=0c=0
  • 特殊性质 C:如果方程有解,那么方程的两个解都是整数。