// #include "num.h"

Num::Num(int value, int modulo) : value(value % modulo), modulo(modulo) {
}

Num &Num::operator=(const Num &other) {
    value = other.value;
    modulo = other.modulo;
    return this;
}

Num Num::operator+(const Num &other) {
    return Num(value + other.value, modulo);
}

Num Num::operator-(const Num &other) {
    return Num(value - other.value, modulo);
}

Num Num::operator(const Num &other) {
    return Num(value * other.value, modulo);
}

Num Num::operator+(int num) {
    return Num(value + num, modulo);
}

Num Num::operator-(int num) {
    return Num(value - num, modulo);
}

Num Num::operator*(int num) {
    return Num(value * num, modulo);
}

Num &Num::operator+=(const Num &other) {
    modulo = other.modulo;
    value = (value + other.value) % modulo;
    return *this;
}

Num &Num::operator-=(const Num &other) {
    modulo = other.modulo;
    value = (value - other.value) < 0 ? (value - other.value) % modulo + modulo : (value - other.value) % modulo;
    return this;
}

Num &Num::operator=(const Num &other) {
    modulo = other.modulo;
    value = (value * other.value) % modulo;
    return *this;
}

Num &Num::operator+=(int num) {
    value = (value + num % modulo) % modulo;
    return *this;
}

Num &Num::operator-=(int num) {
    value = (value - num % modulo) < 0 ? (value - num % modulo) % modulo + modulo : ((value - num % modulo) % modulo);
    return this;
}

Num &Num::operator=(int num) {
    long long lvalue, rvalue;
    lvalue = (long long) value;
    rvalue = (long long) num;
    value = (lvalue % modulo * rvalue % modulo) % modulo;
    return *this;
}