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

· · 个人记录

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

题面:对于一元二次方程 ax^2+bx+c=0

解析

我们首先可以封装一个输出 p \div q 的函数,注意如果我们穿进去的参数为 x, y

那代码应该很好写了......

void frac(int x, int y)
{
  int g = __gcd(x, y);
  x /= g, y /= g;
  if (y < 0)
    x = -x, y = -y;
  printf("%d", x);
  if (y != 1)
    printf("/%d", y);
}

接下来输入

接下来这一步很关键!!!

如果 a<0,则 a=-a, \ b=-b, \ c=-c (保证 a 非负)

接下来计算 \Delta

题解中所有给出的形如 x_1 \ ⊥ \ x_2 的形式,表示 x_1x_2 互质

## Code show 最后秀一波~ ``` #include <bits/stdc++.h> using namespace std; int T, m, a, b, c; void frac(int x, int y) { int g = __gcd(x, y); x /= g, y /= g; if (y < 0) x = -x, y = -y; printf("%d", x); if (y != 1) printf("/%d", y); } int main() { freopen("uqe.in", "r", stdin); freopen("uqe.out", "w", stdout); scanf("%d%d", &T, &m); while (T--) { scanf("%d%d%d", &a, &b, &c); int G = abs(__gcd(__gcd(a, b), c)); a /= G, b /= G, c /= G; if (a < 0) a = -a, b = -b, c = -c; int delta = b * b - (a * c << 2); if (delta < 0) { puts("NO"); continue; } if (!delta) { frac(-b, a << 1), puts(""); continue; } int s = sqrt(delta), q = 1, y = a << 1; if (s * s == delta) { frac(s - b, y), puts(""); continue; } if (b) frac(-b, y), printf("+"); for (int i = 2; i <= s; i++) while (delta % (i * i) == 0) delta /= i * i, q *= i; int g = abs(__gcd(q, y)); q /= g, y /= g; if (q != 1) printf("%d*", q); printf("sqrt(%d)", delta); if (y != 1) printf("/%d", y); puts(""); } return 0; } ```