struct fraction {
long long numerator; // 分子
long long denominator; // 分母
fraction() {
numerator = 0;
denominator = 1;
}
fraction(long long num) {
numerator = num;
denominator = 1;
}
fraction(long long a, long long b) {
numerator = a;
denominator = b;
this->reduction();
}
void operator = (const long long num) {
numerator = num;
denominator = 1;
this->reduction();
}
void operator = (const fraction &b) {
numerator = b.numerator;
denominator = b.denominator;
this->reduction();
}
fraction operator + (const fraction &b) const {
long long gcdnum = __gcd(denominator, b.denominator);
fraction tmp = fraction(numerator*(b.denominator/gcdnum) + b.numerator*(denominator/gcdnum), denominator/gcdnum*b.denominator);
tmp.reduction();
return tmp;
}
fraction operator + (const int &b) const {
return ((*this) + fraction(b));
}
fraction operator - (const fraction &b) const {
return ((*this) + fraction(-b.numerator, b.denominator));
}
fraction operator - (const int &b) const {
return ((*this) - fraction(b));
}
fraction operator * (const fraction &b) const {
fraction tmp = fraction(numerator*b.numerator, denominator * b.denominator);
tmp.reduction();
return tmp;
}
fraction operator * (const int &b) const {
return ((*this) * fraction(b));
}
fraction operator / (const fraction &b) const {
return ((*this) * fraction(b.denominator, b.numerator));
}
void reduction() {
if (numerator == 0) {
denominator = 1;
return;
}
long long gcdnum = __gcd(numerator, denominator);
numerator /= gcdnum;
denominator /= gcdnum;
}
}