#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;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IEZyYWN0aW9uCnsKICAgIHN0ZDo6dWludDMyX3QgTnVtZXJhdG9yOwoJc3RkOjp1aW50MzJfdCBEZW5vbWluYXRvcjsKCUZyYWN0aW9uKHN0ZDo6dWludDMyX3Qgbiwgc3RkOjp1aW50MzJfdCBkKSA6IE51bWVyYXRvcihuKSwgRGVub21pbmF0b3IoZCkgeyB9Cn07CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRnJhY3Rpb24mIGYpCnsKICAgIG9zIDw8ICIoIiA8PCBmLk51bWVyYXRvciA8PCAiIC8gIiA8PCBmLkRlbm9taW5hdG9yIDw8ICIpIjsKCXJldHVybiBvczsKfQoKdHlwZWRlZiBzdGQ6OnZlY3RvcjxGcmFjdGlvbj4gRmFyZXlTZXJpZXM7CgpGYXJleVNlcmllcyBnZW5lcmF0ZV9zZXJpZXMoc3RkOjp1aW50MzJfdCBkZXB0aCkKewogICAgc3RkOjp1aW50MzJfdCBhID0gMDsKCXN0ZDo6dWludDMyX3QgYiA9IDE7CglzdGQ6OnVpbnQzMl90IGMgPSAxOwoJc3RkOjp1aW50MzJfdCBkID0gZGVwdGg7CglGYXJleVNlcmllcyByZXN1bHRzOwoJcmVzdWx0cy5lbXBsYWNlX2JhY2soYSwgYik7Cgl3aGlsZSAoYyA8PSBkZXB0aCkKCXsKICAgICAgICBzdGQ6OnVpbnQzMl90IGsgPSAoZGVwdGggKyBiKSAvIGQ7CgkJc3RkOjp1aW50MzJfdCBuYyA9IChrICogYykgLSBhOwoJCXN0ZDo6dWludDMyX3QgbmQgPSAoayAqIGQpIC0gYjsKCQlhID0gYzsKCQliID0gZDsKCQljID0gbmM7CgkJZCA9IG5kOwoJCXJlc3VsdHMuZW1wbGFjZV9iYWNrKGEsIGIpOwoJfQoJcmV0dXJuIHJlc3VsdHM7Cn0KCmludCBtYWluKCkKewogICAgY29uc3Qgc3RkOjp1aW50MzJfdCBERVBUSCA9IDQ7CglGYXJleVNlcmllcyBzZXJpZXMgPSBnZW5lcmF0ZV9zZXJpZXMoREVQVEgpOwoJc3RkOjpjb3B5KHNlcmllcy5iZWdpbigpLCBzZXJpZXMuZW5kKCksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxGcmFjdGlvbj4oc3RkOjpjb3V0LCAiXG4iKSk7CglyZXR1cm4gMDsKfQ==