如果 m != n,确定 n^m = m^n 的最快方法是什么?
What is the fastest way to determine n^m = m^n if m != n?
这是 hackerearth 练习部分的问题之一。我们需要确定是否 m^n = n^m。当 n = m 时这是微不足道的,所以我们关注 m != n.
1 <= m, n <= 10^10000
我试过的是
n^m = m^n implies
m*log(n) = n*log(m)
但是问题是,这么大的log怎么取呢?是否有其他检查相等性的方法?
让我们做一些数学运算来确定如何编程解决方案:
很容易看出,n和m都不能等于1,因为它们一定不同,不能为空。让我们寻找 1 < n < m.
的解决方案
如您正确所述,nm = mn 意味着 m.log(n) = n.log(m)
因此我们正在寻找 m / log(m) = n / log(n) 和 1 < n < m[=58= 的解决方案].
我们可以研究函数f(x) = x / log(x) for x > 1:
它的导数是f'(x) = (log(x) - 1) / log(x)2
导数在 x = e 处有一个零,f(x) 在 x 之间严格递减= 1 和 x = e 并严格从 x = e 一直增加到无穷大。
任何 2 个不同的数字 n 和 m 使得 f(n) = f(m), n < m 必须满足 1 < n < e 和 m > e
n唯一可能的整数值是2,恰好是m对应值为4的解, 1到e区间没有其他整数。
因此唯一的解决方案是 n=2, m=4 和 n=4, m=2
这里是一个输出所有可能结果的C程序:
#include <stdio.h>
int main() {
printf("2 4\n");
printf("4 2\n");
return 0;
}
这是 hackerearth 练习部分的问题之一。我们需要确定是否 m^n = n^m。当 n = m 时这是微不足道的,所以我们关注 m != n.
1 <= m, n <= 10^10000
我试过的是
n^m = m^n implies
m*log(n) = n*log(m)
但是问题是,这么大的log怎么取呢?是否有其他检查相等性的方法?
让我们做一些数学运算来确定如何编程解决方案:
很容易看出,n和m都不能等于1,因为它们一定不同,不能为空。让我们寻找 1 < n < m.
的解决方案如您正确所述,nm = mn 意味着 m.log(n) = n.log(m)
因此我们正在寻找 m / log(m) = n / log(n) 和 1 < n < m[=58= 的解决方案].
我们可以研究函数f(x) = x / log(x) for x > 1:
它的导数是f'(x) = (log(x) - 1) / log(x)2
导数在 x = e 处有一个零,f(x) 在 x 之间严格递减= 1 和 x = e 并严格从 x = e 一直增加到无穷大。
任何 2 个不同的数字 n 和 m 使得 f(n) = f(m), n < m 必须满足 1 < n < e 和 m > e
n唯一可能的整数值是2,恰好是m对应值为4的解, 1到e区间没有其他整数。
因此唯一的解决方案是 n=2, m=4 和 n=4, m=2
这里是一个输出所有可能结果的C程序:
#include <stdio.h>
int main() {
printf("2 4\n");
printf("4 2\n");
return 0;
}