一元二次方程

一元二次方程

题目描述

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

  • 计算 delta = b^2 - 4ac,则:
    1. 若 delta < 0,则该一元二次方程无实数解;
    2. 否则 delta >= 0,此时该一元二次方程有两个实数解 x_{1,2} = (-b +- sqrt(delta)) / (2a),其中 sqrt(delta) 表示 delta 的算术平方根,即使得 s^2 = delta 的唯一非负实数 s。

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

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

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

  1. 若 delta = b^2 - 4ac < 0,则表明方程无实数解,此时你应当输出 NO;
  2. 否则 delta >= 0,此时方程有两解(可能相等),记其中较大者为 x,则: (1). 若 x 为有理数,则按有理数的格式输出 x。 (2). 否则根据上文公式,x 可以被唯一表示为 x = q1 + q2 x sqrt(r) 的形式,其中: - q1, q2 为有理数,且 q2 > 0; - r 为正整数且 r > 1,且不存在正整数 d > 1 使 d^2 整除 r(即 r 不应是 d^2 的倍数)。 此时: - 若 q1 != 0,则按照有理数的格式输出 q1,再输出一个加号 +; - 随后:若 q2 = 1,则输出 sqrt({r});若 q2 为整数,则输出 {q2}*sqrt({r});若 q3 = 1/q2 为整数,则输出 sqrt({r})/{q3};否则存在唯一整数 c, d 满足 c, d > 1,gcd(c, d) = 1 且 q2 = c/d,此时输出 {c}*sqrt({r})/{d}。

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

输入格式

输入的第一行包含两个正整数 T, M,分别表示方程数和系数绝对值的上界。 接下来 T 行,每行包含三个整数 a, b, c。

输出格式

输出 T 行,每行包含一个字符串,表示对应询问的答案,格式如题所述。每行输出的字符串中间不应包含任何空格。

样例 #1

输入:

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

提示

对于所有测试数据有:1 <= T <= 5000,1 <= M <= 10^3,|a|, |b|, |c| <= M,a != 0。

本题为 CSP-J 第二轮真题(2023 年,uqe)。

在线判题使用官方样例与补充测试数据,程序输出与答案一致即判对。