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

P9750题目链接

解析

题意不多解释,直接上三种分类讨论。

  • \(\Delta < 0\)

直接无解输出。

  • \(\Delta = 0\)

我们输出的就是 \(-\frac{b}{2a}\) 的最简形式。上下同除 \(\gcd\) 即可。注意一下特判分母为 1 以及保证底下的数始终为正即可。

  • \(\Delta > 0\)

这个整出来的式子是 \(\frac{-b \pm \sqrt{\Delta}}{2a}\)

第一项是不是跟 \(\Delta = 0\) 的情况处理是一样的。那么看第二项。

由于带一个 \(\pm\) 号,我们又要输出最大值,所以可以直接取正数值,没必要考虑 \(a < 0\) 的情况。

还要细分两种情况

  1. \(\Delta\) 没有没有平方数因子

直接输出比值。

  1. \(\Delta\) 带平方因子

给它平方因子全扣出来,把这个系数和分母然后上下同除 \(\gcd\),然后跟情况 1 一样再输出。

没啥好讲的,细节问题。

#include <bits/stdc++.h>

#define sqrt(x) __builtin_sqrt(x)
using namespace std;
int up , down , delta , Sqrt , t , m , a , b , c;
void solve() {
	cin >> a >> b >> c;
	delta = b * b - a * c * 4;
	down = a << 1;
	if(delta < 0) {
		cout << "NO" << '\n'; return;	
	}
	else if(delta == 0) {
		if(b == 0) {
			cout << 0 << '\n';
			return;
		}
		int g = __gcd(b , down);
		up = -b / g , down /= g;
		if(down < 0) {up = -up; down = -down;}
		cout << up;
		if(down != 1) {
			cout << "/" << down;
		}
		cout << '\n';
		return;
	}
	else {
		Sqrt = sqrt(delta);
		if(Sqrt * Sqrt == delta) {
			if(a < 0) {
				up = -Sqrt - b; 
			}
			else {
				up = Sqrt - b;
			}
			int g = __gcd(up , down);
			up /= g , down /= g;
			if(down < 0) {up = -up; down = -down;}
			cout << up;
			if(down != 1) {
				cout << "/" << down;
			}
			cout << '\n';
			return;
		}
		else {
			if(b != 0) {
				int g = __gcd(b , down);
				up = -b / g , down /= g;
				if(down < 0) {up = -up; down = -down;}
				cout << up;
				if(down != 1) {
					cout << "/" << down;
				}
				cout << "+";
			}
			down = abs(a << 1);
			register int i;
			for(i = Sqrt; i >= 1; --i) {
				if(delta % (i * i) == 0) {
					break;
				}
			}
			delta /= (i * i);
			if(i == 1) {
				cout << "sqrt(" << delta << ")";
				if(down != 1) {
					cout << "/" << down;
				}
			}
			else {
				int g = __gcd(i , down);
				i /= g , down /= g;
				if(i != 1) {
					cout << i << "*";
				}
				cout << "sqrt(" << delta << ")";
				if(down != 1) {
					cout << "/" << down;	
				} 
			}
			cout << '\n';
		}
	}
}
int main() {
	ios :: sync_with_stdio(0) , cin.tie(0) , cout.tie(0);
	cin >> t >> m;
	while(t--) {
		solve();
	}
	return 0;
}
posted @ 2025-06-17 00:11  「癔症」  阅读(30)  评论(0)    收藏  举报