解释一下类型: 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;
}