CSP-J T3 WA0
  • 板块学术版
  • 楼主emo_male_god
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/26 00:09
  • 上次更新2023/11/2 11:23:12
查看原帖
CSP-J T3 WA0
798157
emo_male_god楼主2023/10/26 00:09

最好是给一些 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("");
	}
}
2023/10/26 00:09
加载中...