最好是给一些 hack 数据,有神犇帮我改代码显然是更好的
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
bool f1, f2;
ll t, m, a, b, c, gcd;
ll delta, m1, m2, d1, d2, sqr;
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> t >> m;
while (t -- )
{
cin >> a >> b >> c;
delta = b * b - 4 * a * c;
if (delta < 0)
{
cout << "NO\n";
continue;
}
f1 = f2 = false;
gcd = __gcd(-b, 2 * a);
m1 = (-b) / gcd, d1 = 2 * a / gcd; // 处理出 -b / 2a 的分子分母
ll most = 1, ttt = delta;
for (int i = sqrt(ttt); i >= 1; i -- ) // 暴力化简根号
{
if (ttt % (i * i) == 0)
{
most *= i;
ttt /= i * i;
}
}
m2 = most, sqr = delta / most / most, d2 = 2 * a;
gcd = __gcd(m2, d2);
m2 /= gcd, d2 /= gcd;
if (sqr <= 1 && abs(d1) == abs(d2)) // 如果同分母,且没有根号,就可以合并
{
if (d1 < 0) d1 = -d1, m1 = -m1;
if (d2 < 0) d2 = -d2, m2 = -m2;
m1 += m2;
gcd = __gcd(m1, d1);
m1 /= gcd, d1 /= gcd;
if ((m1 < 0 && d1 > 0) || (m1 > 0 && d1 < 0)) cout << '-', m1 = abs(m1), d1 = abs(d1);
cout << m1;
if (d1 != 1 && m1 != 0) cout << '/' << d1;
}
else
{
if (m1 == 0) f1 = true;
else
{
if ((m1 < 0 && d1 > 0) || (m1 > 0 && d1 < 0)) cout << '-', m1 = abs(m1), d1 = abs(d1);
cout << m1;
if (d1 != 1 && m1 != 0) cout << '/' << d1;
}
if (m2 == 0) f2 = true;
else
{
if (m2 != 1)
{
if (!f1) cout << '+';
cout << m2;
if (sqr > 1) cout << "*sqrt(" << sqr << ")";
if (d2 != 1) cout << '/' << d2;
}
else
{
if (sqr > 1)
{
if (!f1) cout << '+';
cout << "sqrt(" << sqr << ")";
if (d2 != 1) cout << '/' << d2;
}
}
}
if (f1 && f2) cout << "0";
}
puts("");
}
}