#include <algorithm>
#include <cstdint>
#include <iterator>
#include <iostream>
#include <vector>

struct Fraction
{
    std::uint32_t Numerator;
	std::uint32_t Denominator;
	Fraction(std::uint32_t n, std::uint32_t d) : Numerator(n), Denominator(d) { }
};

std::ostream& operator<<(std::ostream& os, const Fraction& f)
{
    os << "(" << f.Numerator << " / " << f.Denominator << ")";
	return os;
}

typedef std::vector<Fraction> FareySeries;

FareySeries generate_series(std::uint32_t depth)
{
    std::uint32_t a = 0;
	std::uint32_t b = 1;
	std::uint32_t c = 1;
	std::uint32_t d = depth;
	FareySeries results;
	results.emplace_back(a, b);
	while (c <= depth)
	{
        std::uint32_t k = (depth + b) / d;
		std::uint32_t nc = (k * c) - a;
		std::uint32_t nd = (k * d) - b;
		a = c;
		b = d;
		c = nc;
		d = nd;
		results.emplace_back(a, b);
	}
	return results;
}

int main()
{
    const std::uint32_t DEPTH = 4;
	FareySeries series = generate_series(DEPTH);
	std::copy(series.begin(), series.end(), std::ostream_iterator<Fraction>(std::cout, "\n"));
	return 0;
}