#include <iostream>
#include <cmath>
#include <vector>
const double EPSILON = 1e-7; // Точность для сравнения вещественных чисел
// Функция для вычисления корней кубического уравнения по формуле Виета
std::vector<double> solveCubic(double a, double b, double c, double d) {
std::vector<double> roots;
// Приведём уравнение к виду x^3 + Ax^2 + Bx + C = 0
double A = b / a;
double B = c / a;
double C = d / a;
// Вычислим вспомогательные значения
double Q = (3 * B - A * A) / 9;
double R = (9 * A * B - 27 * C - 2 * A * A * A) / 54;
double D = Q * Q * Q + R * R; // Дискриминант
if (D > EPSILON) { // Один действительный корень
double S = std::cbrt(R + std::sqrt(D));
double T = std::cbrt(R - std::sqrt(D));
roots.push_back(-A / 3 + S + T);
} else if (std::abs(D) < EPSILON) { // Все корни действительны, по крайней мере два из них равны
double S = std::cbrt(R);
roots.push_back(-A / 3 + 2 * S);
roots.push_back(-A / 3 - S);
} else { // Три различных действительных корня
double theta = std::acos(R / std::sqrt(-Q * Q * Q));
roots.push_back(2 * std::sqrt(-Q) * std::cos(theta / 3) - A / 3);
roots.push_back(2 * std::sqrt(-Q) * std::cos((theta + 2 * M_PI) / 3) - A / 3);
roots.push_back(2 * std::sqrt(-Q) * std::cos((theta + 4 * M_PI) / 3) - A / 3);
}
return roots;
}
int main() {
// Коэффициенты первой кривой y = px^3 + ox^2 + nx + m
double p, o, n, m;
std::cout << "Введите коэффициенты первой кривой (p, o, n, m): ";
std::cin >> p >> o >> n >> m;
// Коэффициенты второй кривой y = lx^3 + wx + v
double l, w, v;
std::cout << "Введите коэффициенты второй кривой (l, w, v): ";
std::cin >> l >> w >> v;
// Составим кубическое уравнение для нахождения точек пересечения
double a = p - l;
double b = o;
double c = n - w;
double d = m - v;
// Решим кубическое уравнение
std::vector<double> xRoots = solveCubic(a, b, c, d);
if (xRoots.empty()) {
std::cout << "Кривые не пересекаются.\n";
} else {
std::cout << "Точки пересечения:\n";
for (double x : xRoots) {
double y = p * x * x * x + o * x * x + n * x + m;
std::cout << "x = " << x << ", y = " << y << "\n";
}
}
return 0;
}