#include <iostream>
#include <cmath>
#include <vector>
#include <tuple>
#include <cstdint>
#include <limits>
#include <algorithm>
typedef std::tuple<std::uint64_t,std::uint64_t, std::uint64_t> Triple;
typedef std::vector<Triple> RType;
typedef std::vector<std::uint64_t> DType;
DType SepDigit(std::uint64_t N) {
std::uint64_t V = 0;
DType D;
while (N != 0){
V = N % 10;
N /= 10;
D.push_back(V);
}
return D;
}
bool Check(std::uint64_t N, std::uint64_t M) {
DType A = SepDigit(N);
DType B = SepDigit(M);
for (size_t i = 0; i < B.size(); i++){
if (A[i] != B[i]) return false;
}
return true;
}
RType MakeHoge(std::uint64_t N) {
std::uint64_t Root = 0;
double V=0;
RType R;
for (std::uint64_t i = 2; i < N; i++){//1は自明。
// Root = std::round(std::pow(i,0.5));//sqrt
Root = std::numeric_limits<std::uint64_t>::digits;
for (std::uint64_t j = 2; j <= Root; j++){
V = std::pow(i,1 / static_cast<double>(j));
if (V == static_cast<std::uint64_t>(V)) {
if (Check(i, static_cast<std::uint64_t>(V)) == true) {
R.push_back(std::make_tuple(static_cast<std::uint64_t>(V), j, i));
}
}
}
}
return R;
}
bool Show(RType R, bool IsSort = false) {
std::uint64_t N = 0;
std::uint64_t M = 0;
std::uint64_t V = 0;
if (IsSort == true) std::sort(R.begin(), R.end());
for (auto&o : R) {
std::tie(N, M, V) = o;
std::cout << N << '^' << M << " -> " << V << std::endl;
}
return true;
}
int main() {
std::uint64_t N = 300000;
RType R;
R = MakeHoge(N);
Show(R,true);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDx0dXBsZT4KI2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxsaW1pdHM+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp0eXBlZGVmIHN0ZDo6dHVwbGU8c3RkOjp1aW50NjRfdCxzdGQ6OnVpbnQ2NF90LCBzdGQ6OnVpbnQ2NF90PiBUcmlwbGU7CnR5cGVkZWYgc3RkOjp2ZWN0b3I8VHJpcGxlPiBSVHlwZTsKdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnVpbnQ2NF90PiBEVHlwZTsKCkRUeXBlIFNlcERpZ2l0KHN0ZDo6dWludDY0X3QgTikgewoJc3RkOjp1aW50NjRfdCBWID0gMDsKCURUeXBlIEQ7Cgl3aGlsZSAoTiAhPSAwKXsKCQlWID0gTiAlIDEwOwoJCU4gLz0gMTA7CgkJRC5wdXNoX2JhY2soVik7CgoJfQoJcmV0dXJuIEQ7Cn0KCmJvb2wgQ2hlY2soc3RkOjp1aW50NjRfdCBOLCBzdGQ6OnVpbnQ2NF90IE0pIHsKCURUeXBlIEEgPSBTZXBEaWdpdChOKTsKCURUeXBlIEIgPSBTZXBEaWdpdChNKTsKCglmb3IgKHNpemVfdCBpID0gMDsgaSA8IEIuc2l6ZSgpOyBpKyspewoJCWlmIChBW2ldICE9IEJbaV0pIHJldHVybiBmYWxzZTsKCX0KCXJldHVybiB0cnVlOwp9CgpSVHlwZSBNYWtlSG9nZShzdGQ6OnVpbnQ2NF90IE4pIHsKCglzdGQ6OnVpbnQ2NF90IFJvb3QgPSAwOwoJZG91YmxlIFY9MDsKCVJUeXBlIFI7CgoJZm9yIChzdGQ6OnVpbnQ2NF90IGkgPSAyOyBpIDwgTjsgaSsrKXsvLzHjga/oh6rmmI7jgIIKCS8vCVJvb3QgPSBzdGQ6OnJvdW5kKHN0ZDo6cG93KGksMC41KSk7Ly9zcXJ0CgkJUm9vdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjp1aW50NjRfdD46OmRpZ2l0czsKCQlmb3IgKHN0ZDo6dWludDY0X3QgaiA9IDI7IGogPD0gUm9vdDsgaisrKXsKCQkJViA9IHN0ZDo6cG93KGksMSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oaikpOwoJCQlpZiAoViA9PSBzdGF0aWNfY2FzdDxzdGQ6OnVpbnQ2NF90PihWKSkgewoJCQkJaWYgKENoZWNrKGksIHN0YXRpY19jYXN0PHN0ZDo6dWludDY0X3Q+KFYpKSA9PSB0cnVlKSB7CgkJCQkJUi5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHN0YXRpY19jYXN0PHN0ZDo6dWludDY0X3Q+KFYpLCBqLCBpKSk7CgkJCQl9CgkJCX0KCQl9Cgl9CglyZXR1cm4gUjsKfQoKYm9vbCBTaG93KFJUeXBlIFIsIGJvb2wgSXNTb3J0ID0gZmFsc2UpIHsKCXN0ZDo6dWludDY0X3QgTiA9IDA7CglzdGQ6OnVpbnQ2NF90IE0gPSAwOwoJc3RkOjp1aW50NjRfdCBWID0gMDsKCWlmIChJc1NvcnQgPT0gdHJ1ZSkgc3RkOjpzb3J0KFIuYmVnaW4oKSwgUi5lbmQoKSk7Cglmb3IgKGF1dG8mbyA6IFIpIHsKCQlzdGQ6OnRpZShOLCBNLCBWKSA9IG87CgkJc3RkOjpjb3V0IDw8IE4gPDwgJ14nIDw8IE0gPDwgIiAtPiAiIDw8IFYgIDw8IHN0ZDo6ZW5kbDsKCX0KCXJldHVybiB0cnVlOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6dWludDY0X3QgIE4gPSAzMDAwMDA7CglSVHlwZSBSOwoKCVIgPSBNYWtlSG9nZShOKTsKCVNob3coUix0cnVlKTsKCglyZXR1cm4gMDsKfQ==