#include <iostream>
#include <math.h>
#include <iomanip>
const double PI = 3.14159265;
template<typename Type>
auto bezwzgledna(Type var)
{
if (var < 0)
return -var;
else
return var;
}
class Wspolrzedna
{
private:
public:
double x;
double y;
Wspolrzedna() {}
Wspolrzedna(double a, double b) : x(a), y(b) {}
bool operator==(Wspolrzedna & druga)
{
if (x == druga.x && y == druga.y)
return true;
else
return false;
}
};
class Bierka
{
private:
bool minus(double a) { if (a < 0) return true; else return false; }
bool getLineIntersection(double p0_x, double p0_y, double p1_x, double p1_y, double p2_x, double p2_y, double p3_x, double p3_y)
{
double s1_x, s1_y, s2_x, s2_y;
s1_x = p1_x - p0_x;
s1_y = p1_y - p0_y;
s2_x = p3_x - p2_x;
s2_y = p3_y - p2_y;
double s, t;
s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y);
t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);
if (s > 0 && s < 1 && t > 0 && t < 1)
return true;
else
return false;
}
public:
Wspolrzedna pierwsza;
Wspolrzedna druga;
Bierka() {}
Bierka(double x1, double y1, double x2, double y2) : pierwsza(x1, y1), druga(x1, y1) {}
bool null() {
if (pierwsza == druga)
return true;
else
return false;
}
bool L(Bierka & second);
bool X(Bierka & second)
{
if (null() || second.null())
return false;
else
return getLineIntersection(pierwsza.x, pierwsza.y, druga.x, druga.y, second.pierwsza.x, second.pierwsza.y, second.druga.x, second.druga.y);
}
bool V(Bierka & second);
bool koniec_styczny(Bierka & second);
// Metody sprawdzające czy funkcja jest stała i jaka konkretnie
bool stala() { if (pierwsza.x == druga.x || pierwsza.y == druga.y) return true; else return false; }
bool stala_x() { if (pierwsza.x == druga.x) return true; else return false; }
bool stala_y() { if (pierwsza.y == druga.y) return true; else return false; }
};
bool Bierka::koniec_styczny(Bierka & second)
{
if (
((druga == second.druga) && !(pierwsza == second.pierwsza)) ||
((druga == second.pierwsza) && !(pierwsza == second.druga)) ||
(!(druga == second.druga) && (pierwsza == second.pierwsza)) ||
(!(druga == second.pierwsza) && (pierwsza == second.druga))
)
return true;
else
return false;
}
bool Bierka::L(Bierka & second)
{
if (null() || second.null())
return false;
else if (koniec_styczny(second) && !stala() && !second.stala())
{
double a1, a2;
if (druga.x != pierwsza.x)
a1 = (druga.y - pierwsza.y) / (druga.x - pierwsza.x);
else
a1 = 0;
if (second.druga.x != second.pierwsza.x)
a2 = (second.druga.y - second.pierwsza.y) / (second.druga.x - second.pierwsza.x);
else
a2 = 0;
if (a1*a2 == -1)
return true;
else return false;
}
else if (koniec_styczny(second) && ((stala_x() && second.stala_y()) || (stala_y() && second.stala_x())))
return true;
else
return false;
}
bool Bierka::V(Bierka & second)
{
if (null() || second.null())
return false;
else if (koniec_styczny(second))
{
double x_vektora, y_vektora, second_x_vektora, second_y_vektora;
// Warunki określające początek wektorów (tak aby oba wektory miały początek w punkcie wspólnym
if (druga == second.druga)
{
x_vektora = pierwsza.x - druga.x;
y_vektora = pierwsza.y - druga.y;
second_x_vektora = second.pierwsza.x - second.druga.x;
second_y_vektora = second.pierwsza.y - second.druga.y;
}
else if (druga == second.pierwsza)
{
x_vektora = pierwsza.x - druga.x;
y_vektora = pierwsza.y - druga.y;
second_x_vektora = second.druga.x - second.pierwsza.x;
second_y_vektora = second.druga.y - second.pierwsza.y;
}
else if (pierwsza == second.druga)
{
x_vektora = druga.x - pierwsza.x;
y_vektora = druga.y - pierwsza.y;
second_x_vektora = second.pierwsza.x - second.druga.x;
second_y_vektora = second.pierwsza.y - second.druga.y;
}
else if (pierwsza == second.pierwsza)
{
x_vektora = druga.x - pierwsza.x;
y_vektora = druga.y - pierwsza.y;
second_x_vektora = second.druga.x - second.pierwsza.x;
second_y_vektora = second.druga.y - second.pierwsza.y;
}
double angle;
double kat_main = atan2(y_vektora, x_vektora) * 180 / PI;
double kat_second = atan2(second_y_vektora, second_x_vektora) * 180 / PI;
// warunki sprawdzające czy atan dało wynik ujemny
if (kat_main < 0)
kat_main = 360 - bezwzgledna(kat_main);
if (kat_second < 0)
kat_second = 360 - bezwzgledna(kat_second);
angle = bezwzgledna(kat_main - kat_second);
if (angle < 90 && angle > 0)
return true;
else
return false;
}
else
return false;
}
int main()
{
int ile;
std::cin >> ile;
Bierka * bierki = new Bierka[ile * 2];
double x1, y1, x2, y2;
for (int i = 0; i < ile * 2; i++)
{
std::cin >> x1 >> y1 >> x2 >> y2;
bierki[i].pierwsza.x = x1;
bierki[i].pierwsza.y = y1;
bierki[i].druga.x = x2;
bierki[i].druga.y = y2;
}
char * liczby_rzymskie = new char[ile];
for (int i = 0, g = 0; i < ile * 2; i += 2, g++)
{
if (bierki[i].L(bierki[i + 1]))
liczby_rzymskie[g] = 'L';
else if (bierki[i].X(bierki[i + 1]))
liczby_rzymskie[g] = 'X';
else if (bierki[i].V(bierki[i + 1]))
liczby_rzymskie[g] = 'V';
else
liczby_rzymskie[g] = '-';
}
long double iloczyn = 1;
for (int i = 0; i < ile; i++)
{
switch (liczby_rzymskie[i])
{
case 'L':
printf("L\n");
iloczyn *= 50;
break;
case 'X':
printf("X\n");
iloczyn *= 10;
break;
case 'V':
printf("V\n");
iloczyn *= 5;
break;
case '-':
printf("-\n");
}
}
std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(0) << iloczyn;
delete[] liczby_rzymskie;
delete[] bierki;
return 0;
}