D的数学解法
不如枚举来的简单粗暴, 细节多一点.
看成一个解方程找0点的问题.分三类
- 方程无解,判别式<0.
- 有解,但是解中存在无理数.
- 存在有理数解.
只有第3种情况合法. 简单移项后可以得到初步答案. 但因为本质是解一个f(x)=0的方程, 所以和原始方程在倍数上和符号上不一定完全等价. 于是先求gcd除去公因数(gcd主要保证后面倍数一定不出现分数)再a/(a1*a2)求一个和原始式子差的倍率r.
import math for _ in range(int(input())): a, b, c = map(int, input().split()) delta = b**2 - 4 * a * c if delta < 0: print("NO") elif delta >= 0: D = math.sqrt(delta) if delta != int(D)**2: print("NO") else: D = int(D) g1 = math.gcd(abs(2*a), abs(b - D)) g2 = math.gcd(abs(2*a), abs(b + D)) a1, b1 = 2*a // g1, (b - D) // g1 a2, b2 = 2*a // g2, (b + D) // g2 r = a // (a1 * a2) assert r != 0 print(r * a1, r * b1, a2, b2)