社区讨论

关于CSP-J T3

学术版参与者 3已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo8merfk
此快照首次捕获于
2023/10/27 20:59
2 年前
此快照最后确认于
2023/11/02 11:10
2 年前
查看原帖
先不说WA的问题,求教为啥会RE五个
CPP
#include <bits/stdc++.h>
using namespace std;
int square[2005];

pair<int, int> minimize(int x)
{
	for (int i = 2000; i > 0; i--)
	{
		if (x % square[i] == 0)
		{
			return make_pair(i, x / square[i]);
		}
	}
}

bool isSquare(int x)
{
	for (int i = 1; i <= 2000; i++)
	{
		if (x == square[i])
		{
			return 1;
		}
	}
	return 0;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t, m;
	cin >> t >> m;
	for (int i = 1; i <= 2 * m; i++)
	{
		square[i] = i * i;
	}
	while (t--)
	{
		int a, b, c;
		cin >> a >> b >> c;
		int delta = b * b - 4 * a * c;
		if (delta < 0)
		{
			cout << "NO" << endl;
			continue;
		} 
		pair<int, int> ans = minimize(delta);
		int xishu = ans.first;
		int genshi = ans.second;
		int g2 = __gcd(abs(xishu), abs(2 * a));
		int XISHU = xishu / g2;
		int A2 = abs(2 * a / g2); 
		if (b == 0)
		{
			if (A2 == 1 && XISHU == 1)
			{
				printf("sqrt(%d)\n", genshi);
			}
			if (A2 == 1 && XISHU != 1)
			{
				printf("%d*sqrt(%d)\n", XISHU, genshi);
			}
			if (A2 != 1 && XISHU == 1)
			{
				printf("sqrt(%d)/%d\n", genshi, A2);
			}
			if (A2 != 1 && XISHU != 1)
			{
				printf("%d*sqrt(%d)/%d", XISHU, genshi, A2);
			}
			continue;
		}
		else
		{
				int g1 = __gcd(abs(-b), abs(2 * a));
			int B = -b / g1;
			int A1 = 2 * a / g1;
			if (delta == 0)
			{
				if (A1 == 1)
				{
					printf("%d\n", B);
				}
				else
				{
					printf("%d/%d\n", B, A1);
				}
				continue;
			}
			if (isSquare(delta))
			{
				int fenzi = B * A2 + sqrt(delta) * A1;
				int fenmu = A1 * A2;
				if (fenmu < 0)
				{
					fenzi *= -1;
					fenmu *= -1;
				}
				int g = __gcd(fenzi, fenmu);
				fenzi /= g;
				fenmu /= g;
				if (fenmu == 1)
				{
					printf("%d\n", fenzi);
				}
				else
				{
					printf("%d/%d\n", fenzi, fenmu);
				}
				continue;
			}
			if (A1 < 0)
			{
				B *= -1;
				A1 *= -1;
			}
			if (XISHU == 1)
			{
				if (A1 == 1 && A2 != 1)
				{
					printf("%d+sqrt(%d)/%d\n", B, genshi, A2); 
				}
				else if (A1 != 1 && A2 == 1)
				{
					printf("%d/%d+sqrt(%d)\n", B, A1, genshi);
				}
				else
				{
					printf("%d/%d+sqrt(%d)/%d\n", B, A1, genshi, A2);
				}
			}
			else
			{
				if (A1 == 1 && A2 != 1)
				{
					printf("%d+%d*sqrt(%d)/%d\n", B, XISHU, genshi, A2); 
				}
				else if (A1 != 1 && A2 == 1)
				{
					printf("%d/%d+%d*sqrt(%d)\n", B, A1, XISHU, genshi);
				}
				else
				{
					printf("%d/%d+%d*sqrt(%d)/%d\n", B, A1, XISHU, genshi, A2);
				}
			}
		}
		
	}
	return 0;
} 

回复

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

正在加载回复...