社区讨论

J组T3求助()

灌水区参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo02fv9w
此快照首次捕获于
2023/10/21 21:18
2 年前
此快照最后确认于
2023/11/02 12:08
2 年前
查看原帖
rt,求个正解代码也行
CPP
#include <bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3f, M = 1e3 + 10;
long long T, m;
vector<long long> p;
unordered_map<long long, bool> pf;
vector<long long> wp;
bool visit[M];
void os()
{
	visit[1] = 1;
	for (long long i = 2; i <= m; i++)
	{
		if (!visit[i])
			p.push_back(i);
		for (long long j = 0; j < p.size() && p[j] * i <= m; j++)
		{
			visit[p[j] * i] = 1;
			if (i % p[j] == 0)
				break;
		}
	}
	return;
}
bool pwl(long long x)
{
	if (x == 0 || x == 1)
		return 0;
	if (pf.find(x) == pf.end())
		return 1;
	return 0;
}
void s()
{
	long long a, b, c;
	long long ans1, ans2, ans3;
	cin >> a >> b >> c;
	if (b * b - 4 * a * c < 0)
	{
		cout << "NO" << endl;
		return;
	}
	if (pwl(b * b - 4 * a * c))
	{
		ans1 = -b;
		ans2 = 2 * a;
		for (long long i = 0; i < p.size() && p[i] <= min(abs(ans1), abs(ans2)); i++)
		{
			if (ans1 % p[i] == 0 && ans2 % p[i] == 0)
			{
				ans1 /= p[i];
				ans2 /= p[i];
				i--;
			}
		}
		if (ans2 < 0)
		{
			ans2 *= -1;
			ans1 *= -1;
		}
		if (ans1 != 0)
		{
			if (ans2 == 1)
				cout << ans1 << '+';
			else
				cout << ans1 << '/' << ans2 << '+';
		}
		ans1 = b * b - 4 * a * c;
		ans3 = 1;
		for (long long i = wp.size() - 1; i >= 0; i--)
		{
			if (wp[i] == 1)
				break;
			if (wp[i] > ans1)
				continue;
			if (ans1 % wp[i] == 0)
			{
				ans3 *= sqrt(wp[i]);
				ans1 /= wp[i];
				i++;
			}
		}

		if ((long long)(ans3 * 1.0 / 2 / a) == ceil((ans3 * 1.0 / 2 / a)))
		{
			if (ans3 * 1.0 / 2 / a == 1)
				cout << "sqrt(" << abs(ans1) << ")\n";
			else
				cout << fabs(ans3 * 1.0 / 2 / a) << "*sqrt(" << ans1 << ")\n";
		}
		else
		{
			long long ans5 = ans3, ans6 = 2 * a;
			for (long long i = 0; i < p.size() && p[i] <= min(abs(ans5), abs(ans6)); i++)
			{
				if (ans5 % p[i] == 0 && ans6 % p[i] == 0)
				{
					ans5 /= p[i];
					ans6 /= p[i];
					i--;
				}
			}
			ans5 = abs(ans5);
			ans6 = abs(ans6);
			if (ans5 == 1)
				cout << "sqrt(" << ans1 << ")/" << ans6 << '\n';
			else
				cout << ans5 << "*sqrt(" << ans1 << ")/" << ans6 << '\n';
		}
		return; 
	}
	if (a > 0)
		ans1 = -b + sqrt(b * b - 4 * a * c);
	else
		ans1 = -b - sqrt(b * b - 4 * a * c);
	ans2 = 2 * a;
	for (long long i = 0; i < p.size() && p[i] <= min(abs(ans1), abs(ans2)); i++)
	{
		if (ans1 % p[i] == 0 && ans2 % p[i] == 0)
		{
			ans1 /= p[i];
			ans2 /= p[i];
			i--;
		}
	}
	if (ans2 < 0)
	{
		ans2 *= -1;
		ans1 *= -1;
	}
	if (ans2 == 1)
		cout << ans1 << endl;
	else
		cout << ans1 << '/' << ans2 << '\n';
	return;
}

signed main()
{
	freopen("uqe.in", "r", stdin);
	freopen("uqe.out", "w", stdout);
	cin >> T >> m;
	os();
	pf[0] = 1;
	for (long long i = 1; i * i <= m * m; i++)
	{
		wp.push_back(i * i);
		pf[i * i] = 1;
	}
	while (T--)
		s();
	fclose(stdin);
	fclose(stdout);
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...