P9750 样例都通过,但 - 第一个测试点以外WA
查看原帖
P9750 样例都通过,但 - 第一个测试点以外WA
1069772
wang_yu_han楼主2023/11/26 16:34

解释一下类型: array<int, 2>(a, b): 表示分数a/b array<unsigned int, 2>(a, b): 表示化简平方根asqrt(b) array<int, 3>(a, b, c): 表示分数x平方根a/bsqrt(c)

#include <algorithm>
#include <array>
#include <cassert>
#include <cmath>
#include <iostream>
#include <string>


std::array<unsigned int, 2> simplifySqrt(int beforeSqrt) {
	assert(beforeSqrt>=0);
	if (!beforeSqrt) {
		return {1, 0};  //as for a*sqrt(b), if a=0, some function will try to divide by a, which is 0, which will cause an error
	}
	unsigned int maxFactor=std::sqrt(beforeSqrt);
	for (unsigned int i=maxFactor; i>0; --i) {
		if (!(beforeSqrt%(i*i))) {
			return {i, beforeSqrt/(i*i)};
		}
	}
	//shouldn't get here
	assert(0);
	return {-1U, -1U};
}


std::array<int, 2> simplifyRational(std::array<int, 2> rational) {
	if (rational[1]<0) {
		rational[0] = -rational[0];
		rational[1] = -rational[1];
	}
	int gcd=std::abs(std::__gcd(rational[0], rational[1]));
	return {rational[0]/gcd, rational[1]/gcd};
}


std::array<int, 3> simplifyIrrational(std::array<int, 3> irrational) {
	auto sqrt=simplifySqrt(irrational[2]);
	irrational[0] *= sqrt[0];
	irrational[2] = sqrt[1];
    auto k=simplifyRational({irrational[0], irrational[1]});
    irrational[0] = k[0];
    irrational[1] = k[1];
    return irrational;
}


std::array<int, 2> add(const std::array<int, 2>& a, const std::array<int, 2>& b) {
	std::array<int, 2> result={0, a[1]/std::__gcd(a[1], b[1])*b[1]};
	result[0] += result[1]/a[1]*a[0];
	result[0] += result[1]/b[1]*b[0];
	result = simplifyRational(result);
	return result;
}


std::string str_rational(const std::array<int, 2>& rational) {
	assert(simplifyRational(rational)==rational);
	std::string result;
	if (rational[0]) {
		result += std::to_string(rational[0]);
		if (rational[1]!=1) {
			result += "/" + std::to_string(rational[1]);
		}
	}
	return result;
}


std::string str_irrational(std::array<int, 3> irrational) {
	assert(simplifyIrrational(irrational)==irrational);
	assert(irrational[2]!=1);  //whether it's rational
	std::string result;
	if (irrational[0] && irrational[2]) {
		if (irrational[0]!=1) {
			result += std::to_string(irrational[0]) + "*";
		}
		result += "sqrt(" + std::to_string(irrational[2]) + ")";
		if (irrational[1]!=1) {
			result += "/" + std::to_string(irrational[1]);
		}
	}
	return result;
}


int main() {
	std::ios::sync_with_stdio(0); std::cin.tie(nullptr);

	unsigned int n=-1, m=-1; std::cin >> n >> m;
	int a=-1, b=-1, c=-1, d=-1;
	std::array<int, 2> rational={};
	std::array<int, 3> irrational={};
	std::string sRational, sIrrational;
    for (unsigned int i=0; i<n; ++i) {
		std::cin >> a >> b >> c;
		d = b*b - 4*a*c;
		if (d<0) {
			std::cout << "NO";
		}
		else {
			rational = {-b, 2*a}; rational = simplifyRational(rational);
			irrational = {1, 2*a, d}; irrational = simplifyIrrational(irrational);
			if (irrational[2]==1) {
				rational = add(rational, {irrational[0], irrational[1]});
				irrational = {0, 1, 0};
			}
			sRational = str_rational(rational);
			sIrrational = str_irrational(irrational);
			if (!sRational.empty()) {
				std::cout << sRational;
				if (!sIrrational.empty()) {
					std::cout << "+" << sIrrational;
				}
			}
			else {
				if (!sIrrational.empty()) {
					std::cout << sIrrational;
				}
				else {
					std::cout << "0";
				}
			}
		}
		std::cout << "\n";
    }
    return 0;
}

2023/11/26 16:34
加载中...