0402 [CSP-J 2023] 一元二次方程 | OJ题库 | CODE STUDY
CODE STUDY
Programming Practice Platform

欢迎回来

0402

[CSP-J 2023] 一元二次方程

Easy 时间限制 1000 ms 内存限制 262144 KB
模拟

题目详情

返回题库

题目描述

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

  • 计算Δ=b^2−4ac,则:
    1. 若Δ<0,则该一元二次方程无实数解。
    2. 否则Δ≥0,此时该一元二次方程有两个实数解微信图片_20231031085658.png

例如:

  • x^2+x+1=0无实数解,因为Δ=12−4×1×1=−3<0。
  • x^2−2x+1=0有两相等实数解x1=x2​=1。
  • x^2−3x+2=0有两互异实数解x1​=1,x2​=2。

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


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

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

  • 由有理数的定义,存在唯一的两个整数p和q,满足q>0,gcd(p,q)=1且v=q/p​。

  • 若q=1,则输出{p},否则输出{p}/{q},其中{n}代表整数n的值;

  • 例如:

    • 当v=−0.5时,p和q的值分别为−1和2,则应输出-1/2
    • 当v=0时,p和q的值分别为0和1,则应输出0

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

  1. 若Δ=b2−4ac<0,则表明方程无实数解,此时你应当输出NO

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

    1. 若x为有理数,则按有理数的格式输出x。

    2. 否则根据上文公式,x可以被唯一表示为x=q1​+q2*sqrt(​r​)的形式,其中:

      • q1​,q2​为有理数,且q2​>0;
      • r为正整数且r>1,且不存在正整数d>1使d^2∣r(即r不应是d^2的倍数);

此时:

  1. 若q1!=0​,则按有理数的格式输出q1​,并再输出一个加号+
  2. 否则跳过这一步输出;


随后:

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

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

如果方程有实数解,则按要求的格式输出两个实数解中的较大者。否则若方程没有实数解,则输出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
输出
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
editor.py

提交前会先自动运行样例。只有样例全部通过,才会进入后端正式判题。