#include "monede.h"

Raport::Raport(int A, int B) : a(A), b(B) {}

Raport::Raport() : Raport(0, 1) {}

Raport& Raport::operator+=(const Raport& rhs) {
	a = ((long long)a * rhs.b + (long long)b * rhs.a) % 1000000007;
	b = ((long long)b * rhs.b) % 1000000007;
	return *this;
}

Raport& Raport::operator-=(const Raport& rhs) {
	a = ((long long)a * rhs.b - (long long)b * rhs.a) % 1000000007;
	if (a < 0)
		a += 1000000007;
	b = ((long long)b * rhs.b) % 1000000007;
	return *this;
}

Raport& Raport::operator*=(const Raport& rhs) {
	a = ((long long)a * rhs.a) % 1000000007;
	b = ((long long)b * rhs.b) % 1000000007;
	return *this;
}

Raport& Raport::operator/=(const Raport& rhs) {
	a = ((long long)a * rhs.b) % 1000000007;
	b = ((long long)b * rhs.a) % 1000000007;
	return *this;
}

bool Raport::operator==(const Raport& rhs) const {
	return ((long long)a * rhs.b - (long long)b * rhs.a) % 1000000007 == 0;
}

bool Raport::operator!=(const Raport& rhs) const { return !(*this == rhs); }

Raport operator+(Raport a, const Raport& b) { return a += b; }

Raport operator-(Raport a, const Raport& b) { return a -= b; }

Raport operator*(Raport a, const Raport& b) { return a *= b; }

Raport operator/(Raport a, const Raport& b) { return a /= b; }