D的数学解法

不如枚举来的简单粗暴, 细节多一点.

看成一个解方程找0点的问题.分三类

  1. 方程无解,判别式<0.
  2. 有解,但是解中存在无理数.
  3. 存在有理数解.

只有第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)


全部评论
哥们,我这个和你的思路一模一样啊,为啥只有40分。你那个`r = a // (a1 * a2)`不会担心无法整除吗,这种不应该也是NO吗。 https://ac.nowcoder.com/acm/contest/view-submission?submissionId=69969874
点赞 回复 分享
发布于 2024-07-08 11:35 湖北

相关推荐

北漂的牛马人:211佬,包进的,可能是系统问题
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务