#include <iostream>
#include <cstdint>
#include <tuple>
#include <vector>
#include <algorithm>
#include <numeric>
typedef std::tuple<std::size_t, std::size_t> VType;
typedef std::vector<VType> DType;
//パクってきた:http://k...content-available-to-author-only...e.jp/prog/c/tip0000a.shtml
//C++17で入るのでそっちを使ってくれ。
//*********************************************************
// 最大公約数(Greatest Common Divisor)を返す。
// 引数に0がある場合は0を返す。
//*********************************************************
template<class T>
T gcd(T m, T n)
{
// 引数に0がある場合は0を返す
if ((0 == m) || (0 == n))
return 0;
// ユークリッドの方法
while (m != n)
{
if (m > n) m = m - n;
else n = n - m;
}
return m;
}//gcd
DType EnumFareySequence(const std::uint64_t& N) {
DType R;
R.push_back({0,1});
for (std::size_t i = 1; i <= N; i++) {
for (std::size_t j = 1; j < i; j++) {
if(gcd(i,j)==1)R.push_back({ j,i });
}
}
R.push_back({ 1,1 });
std::sort(R.begin(), R.end(), [](VType& A, VType B) {
std::uint64_t A1, A2;
std::uint64_t B1, B2;
std::tie(A1, A2) = A;
std::tie(B1, B2) = B;
return (A1 / static_cast<double>(A2)) < (B1 / static_cast<double>(B2));
});
return R;
}
VType MakeHoge(std::size_t N,std::size_t P) {
DType D = EnumFareySequence(N);
return (P-1 >= D.size()) ? (VType{ 1, 1 }) : D[P-1];//何で無名初期化子がつかえないのかにゃ?
}
bool Show(const std::size_t& N, const std::size_t& P, const VType& V) {
std::cout << N << 'D' << P << "th => " << std::get<0>(V) << '/' << std::get<1>(V) << std::endl;
return true;
}
int main() {
std::size_t N = 5;
std::size_t P = 4;
VType V;
V = MakeHoge(N,P);
Show(N, P, V);
N = 24;
P = 17;
V = MakeHoge(N,P);
Show(N, P, V);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8bnVtZXJpYz4KCnR5cGVkZWYgc3RkOjp0dXBsZTxzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3Q+IFZUeXBlOwp0eXBlZGVmIHN0ZDo6dmVjdG9yPFZUeXBlPiBEVHlwZTsKCi8v44OR44Kv44Gj44Gm44GN44Gf77yaaHR0cDovL2suLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuanAvcHJvZy9jL3RpcDAwMDBhLnNodG1sCi8vQysrMTfjgaflhaXjgovjga7jgafjgZ3jgaPjgaHjgpLkvb/jgaPjgabjgY/jgozjgIIKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8g5pyA5aSn5YWs57SE5pWw77yIR3JlYXRlc3QgQ29tbW9uIERpdmlzb3LvvInjgpLov5TjgZnjgIIKLy8g5byV5pWw44Gr77yQ44GM44GC44KL5aC05ZCI44Gv77yQ44KS6L+U44GZ44CCCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnRlbXBsYXRlPGNsYXNzIFQ+ClQgZ2NkKFQgbSwgVCBuKQp7CgkvLyDlvJXmlbDjgavvvJDjgYzjgYLjgovloLTlkIjjga/vvJDjgpLov5TjgZkKCWlmICgoMCA9PSBtKSB8fCAoMCA9PSBuKSkKCQlyZXR1cm4gMDsKCgkvLyDjg6bjg7zjgq/jg6rjg4Pjg4njga7mlrnms5UKCXdoaWxlIChtICE9IG4pCgl7CgkJaWYgKG0gPiBuKSBtID0gbSAtIG47CgkJZWxzZSAgICAgICAgIG4gPSBuIC0gbTsKCX0KCXJldHVybiBtOwp9Ly9nY2QKCkRUeXBlIEVudW1GYXJleVNlcXVlbmNlKGNvbnN0IHN0ZDo6dWludDY0X3QmIE4pIHsKCURUeXBlIFI7CglSLnB1c2hfYmFjayh7MCwxfSk7Cglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgewoJCWZvciAoc3RkOjpzaXplX3QgaiA9IDE7IGogPCBpOyBqKyspIHsKCQkJaWYoZ2NkKGksaik9PTEpUi5wdXNoX2JhY2soeyBqLGkgfSk7CgkJfQoJfQoJUi5wdXNoX2JhY2soeyAxLDEgfSk7CglzdGQ6OnNvcnQoUi5iZWdpbigpLCBSLmVuZCgpLCBbXShWVHlwZSYgQSwgVlR5cGUgQikgewoJCXN0ZDo6dWludDY0X3QgQTEsIEEyOwoJCXN0ZDo6dWludDY0X3QgQjEsIEIyOwoKCQlzdGQ6OnRpZShBMSwgQTIpID0gQTsKCQlzdGQ6OnRpZShCMSwgQjIpID0gQjsKCgkJcmV0dXJuIChBMSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oQTIpKSA8IChCMSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oQjIpKTsKCX0pOwoJcmV0dXJuIFI7Cn0KClZUeXBlIE1ha2VIb2dlKHN0ZDo6c2l6ZV90IE4sc3RkOjpzaXplX3QgUCkgewoJRFR5cGUgRCA9IEVudW1GYXJleVNlcXVlbmNlKE4pOwoKCXJldHVybiAoUC0xID49IEQuc2l6ZSgpKSA/IChWVHlwZXsgMSwgMSB9KSA6IERbUC0xXTsvL+S9leOBp+eEoeWQjeWIneacn+WMluWtkOOBjOOBpOOBi+OBiOOBquOBhOOBruOBi+OBq+OCg++8nwp9Cgpib29sIFNob3coY29uc3Qgc3RkOjpzaXplX3QmIE4sIGNvbnN0IHN0ZDo6c2l6ZV90JiBQLCBjb25zdCBWVHlwZSYgVikgewoKCXN0ZDo6Y291dCA8PCBOIDw8ICdEJyA8PCBQIDw8ICJ0aCA9PiAiIDw8IHN0ZDo6Z2V0PDA+KFYpIDw8ICcvJyA8PCBzdGQ6OmdldDwxPihWKSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gdHJ1ZTsKCn0KCmludCBtYWluKCkgewoJc3RkOjpzaXplX3QgTiA9IDU7CglzdGQ6OnNpemVfdCBQID0gNDsKCVZUeXBlIFY7CgoJViA9IE1ha2VIb2dlKE4sUCk7CglTaG93KE4sIFAsIFYpOwoKCU4gPSAyNDsKCVAgPSAxNzsKCglWID0gTWFrZUhvZ2UoTixQKTsKCVNob3coTiwgUCwgVik7CglyZXR1cm4gMDsKCn0=