Codebook

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub crackersamdjam/Codebook

:warning: Fraction Class
(content/math/fraction.h)

Depends on

Code

#pragma once
#include "../utils/template.h"

/**
 * @brief Fraction Class
 */

struct fraction{
	ll n, d;
	fraction(ll num = 0, ll den = 1){
		n = num, d = den;
		reduce();
	}
	void reduce(){
		if(d < 0) d *= -1, n *= -1;
		if(n == 0)d = 1;
		else if (d == 0)n = 0;
		else {
			ll gc = __gcd((n < 0 ? -n : n), d);
			n /= gc, d /= gc;
		}
	}
	ll toLL() const { return n / d; }
	double toDouble() const { return double((long double) (n) / (long double) (d)); }
	long double toLD() const { return (long double) (n) / (long double) (d); }
	fraction operator+(const fraction &a) const { return fraction(n * a.d + a.n * d, d * a.d); }
	fraction operator-(const fraction &a) const { return fraction(n * a.d - a.n * d, d * a.d); }
	fraction operator*(const fraction &a) const { return fraction(n * a.n, d * a.d); }
	fraction operator/(const fraction &a) const { return fraction(n * a.d, d * a.n); }
	bool operator<(const fraction &a) const { return __int128(n) * __int128(a.d) < __int128(a.n) * __int128(d); }
	bool operator==(const fraction &a) const { return !(*this < a) && !(a < *this); }
	bool operator>=(const fraction &a) const { return !(*this < a); }
	bool operator<=(const fraction &a) const { return !(a < *this); }
	bool operator>(const fraction &a) const { return a < *this; }
	bool operator!=(const fraction &a) const { return (*this < a) || (a < *this); }
	friend ostream& operator<<(ostream& os, fraction const &a) { return os<<a.n<<'/'<<a.d; }
	friend istream& operator>>(istream& is, fraction &a) { char _; is>>a.n>>_>>a.d;assert(_ == '/');  a.reduce(); return is; }
};
#line 1 "content/utils/template.h"
/**
 * @brief My starter code
 */

#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define makeunique(x) (x).erase(unique((x).begin(), (x).end()), (x).end());

#ifdef LOCAL
template<typename T> void pr(T a){std::cerr<<a<<std::endl;}
template<typename T, typename... Args> void pr(T a, Args... args){std::cerr<<a<<' ',pr(args...);}
#else
template<typename... Args> void pr(Args... args){}
#endif

using namespace std;
using ll = long long;
using pii = pair<int, int>;
#line 3 "content/math/fraction.h"

/**
 * @brief Fraction Class
 */

struct fraction{
	ll n, d;
	fraction(ll num = 0, ll den = 1){
		n = num, d = den;
		reduce();
	}
	void reduce(){
		if(d < 0) d *= -1, n *= -1;
		if(n == 0)d = 1;
		else if (d == 0)n = 0;
		else {
			ll gc = __gcd((n < 0 ? -n : n), d);
			n /= gc, d /= gc;
		}
	}
	ll toLL() const { return n / d; }
	double toDouble() const { return double((long double) (n) / (long double) (d)); }
	long double toLD() const { return (long double) (n) / (long double) (d); }
	fraction operator+(const fraction &a) const { return fraction(n * a.d + a.n * d, d * a.d); }
	fraction operator-(const fraction &a) const { return fraction(n * a.d - a.n * d, d * a.d); }
	fraction operator*(const fraction &a) const { return fraction(n * a.n, d * a.d); }
	fraction operator/(const fraction &a) const { return fraction(n * a.d, d * a.n); }
	bool operator<(const fraction &a) const { return __int128(n) * __int128(a.d) < __int128(a.n) * __int128(d); }
	bool operator==(const fraction &a) const { return !(*this < a) && !(a < *this); }
	bool operator>=(const fraction &a) const { return !(*this < a); }
	bool operator<=(const fraction &a) const { return !(a < *this); }
	bool operator>(const fraction &a) const { return a < *this; }
	bool operator!=(const fraction &a) const { return (*this < a) || (a < *this); }
	friend ostream& operator<<(ostream& os, fraction const &a) { return os<<a.n<<'/'<<a.d; }
	friend istream& operator>>(istream& is, fraction &a) { char _; is>>a.n>>_>>a.d;assert(_ == '/');  a.reduce(); return is; }
};
Back to top page