class GfG {
// function to calculate base^expo
// returns early if result exceeds the
// given limit to avoid overflow
static int power(int base, int expo, int limit) {
int result = 1;
// now multiply the number we chose by itself n times
// stop early and return if it exceeds before reaching n times even
for (int i = 0; i < expo; i++) {
result *= base;
if (result > limit)
return result;
}
return result;
}
// function to find the
// n-th root of m
// to find nth room of m means to get the number which needs to be multiplied n times so that we get m
static int nthRoot(int n, int m) {
// n-th root of 0 is 0
if (m == 0) return 0;
// If n is 1, the answer
// is m itself
if (n == 1) return m;
// binary search to find
// the integer root
int low = 1, high = m;
while (low <= high) {
int mid = (low + high) / 2;
// compute mid^n and compare it with m
int val = power(mid, n, m);
// choose a number in the middle of m, m/2 or whatever and
// do x^n to it and see if it satisties .. can we have a number that gives m after multiplied it
// by itself n times..
if (val == m)
return mid;
else if (val < m)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
public static void main
(String[] args
) { int n = 3, m = 64;
// what can i multiply 3 times by itself to get 64.. 4 * 4 * 4
int result = nthRoot(n, m);
}
}
Y2xhc3MgR2ZHIHsKCiAgICAvLyBmdW5jdGlvbiB0byBjYWxjdWxhdGUgYmFzZV5leHBvIAogICAgLy8gcmV0dXJucyBlYXJseSBpZiByZXN1bHQgZXhjZWVkcyB0aGUgCiAgICAvLyBnaXZlbiBsaW1pdCB0byBhdm9pZCBvdmVyZmxvdwogICAgc3RhdGljIGludCBwb3dlcihpbnQgYmFzZSwgaW50IGV4cG8sIGludCBsaW1pdCkgewogICAgICAgIGludCByZXN1bHQgPSAxOwogICAgICAgIC8vIG5vdyBtdWx0aXBseSB0aGUgbnVtYmVyIHdlIGNob3NlIGJ5IGl0c2VsZiBuIHRpbWVzCiAgICAgICAgLy8gc3RvcCBlYXJseSBhbmQgcmV0dXJuIGlmIGl0IGV4Y2VlZHMgYmVmb3JlIHJlYWNoaW5nIG4gdGltZXMgZXZlbgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwbzsgaSsrKSB7CiAgICAgICAgICAgIHJlc3VsdCAqPSBiYXNlOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHJlc3VsdCA+IGxpbWl0KSAgCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8vIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIAogICAgLy8gbi10aCByb290IG9mIG0KICAgIC8vIHRvIGZpbmQgbnRoIHJvb20gb2YgbSBtZWFucyB0byBnZXQgdGhlIG51bWJlciB3aGljaCBuZWVkcyB0byBiZSBtdWx0aXBsaWVkIG4gdGltZXMgc28gdGhhdCB3ZSBnZXQgbQogICAgc3RhdGljIGludCBudGhSb290KGludCBuLCBpbnQgbSkgewogICAgICAgIC8vIG4tdGggcm9vdCBvZiAwIGlzIDAKICAgICAgICBpZiAobSA9PSAwKSByZXR1cm4gMDsKCiAgICAgICAgLy8gSWYgbiBpcyAxLCB0aGUgYW5zd2VyIAogICAgICAgIC8vIGlzIG0gaXRzZWxmCiAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuIG07CgogICAgICAgIC8vIGJpbmFyeSBzZWFyY2ggdG8gZmluZCAKICAgICAgICAvLyB0aGUgaW50ZWdlciByb290CiAgICAgICAgaW50IGxvdyA9IDEsIGhpZ2ggPSBtOwogICAgICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICAgICAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKCiAgICAgICAgICAgIC8vIGNvbXB1dGUgbWlkXm4gYW5kIGNvbXBhcmUgaXQgd2l0aCBtCiAgICAgICAgICAgIGludCB2YWwgPSBwb3dlcihtaWQsIG4sIG0pOwogICAgICAgICAgICAvLyBjaG9vc2UgYSBudW1iZXIgaW4gdGhlIG1pZGRsZSBvZiBtLCBtLzIgb3Igd2hhdGV2ZXIgYW5kIAogICAgICAgICAgICAvLyBkbyB4Xm4gdG8gaXQgYW5kIHNlZSBpZiBpdCBzYXRpc3RpZXMgLi4gY2FuIHdlIGhhdmUgYSBudW1iZXIgdGhhdCBnaXZlcyBtIGFmdGVyIG11bHRpcGxpZWQgaXQgCiAgICAgICAgICAgIC8vIGJ5IGl0c2VsZiBuIHRpbWVzLi4KICAgICAgICAgICAgaWYgKHZhbCA9PSBtKQogICAgICAgICAgICAgICAgcmV0dXJuIG1pZDsgIAogICAgICAgICAgICBlbHNlIGlmICh2YWwgPCBtKQogICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsgIAogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsgCiAgICAgICAgfQoKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIGludCBuID0gMywgbSA9IDY0OyAgCiAgICAgICAgLy8gd2hhdCBjYW4gaSBtdWx0aXBseSAzIHRpbWVzIGJ5IGl0c2VsZiB0byBnZXQgNjQuLiA0ICogNCAqIDQKICAgICAgICBpbnQgcmVzdWx0ID0gbnRoUm9vdChuLCBtKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsgCiAgICB9Cn0=