Estoy tratando de resolver un problema de la competencia de programación
Considere dos secuencias de enteros $f(n) = n!$ $g(n) = a^n$ donde $n$ es un entero positivo. Para cualquier entero $a > 1$ la segunda secuencia es mayor que el primero para un número finito de valores. Pero a partir de un número entero $k$, $f(n)$ es mayor que $g(n)$ todos los $n \ge k$. Que se van a encontrar el menor valor positivo de la $n$ que $f(n) > g(n)$, para un determinado número entero positivo $a > 1$.
Restricciones: 2 <= a <= 10^6 No hay ninguna restricción de n dados. Completo de la declaración del problema enunciado del Problema
Me trató de resolver esta usando la aproximación de Stirling fórmula tomé de registro en ambos lados y resuelto, pero el online juez está volviendo a la respuesta equivocada. Me pregunto si hay una forma más precisa la fórmula o si usted puede sugerir cualquier nuevo método para reducir las funciones anteriores?
Mi código para esto si que ayuda.
int l = in.readInt();
int low = 1;
int high = 1000000;
int ans = 0;
double loga = Math.log10(l);
outer:
while (low <= high) {
int middle = (low + high) / 2;
double sum = 0.0;
double sum1 = 0.0;
/*
int i=1;
for (i = 1; i <= middle; i++) {
sum = sum + Math.log10(i); //This is giving TLE //Method 1
}
sum1 = sum + Math.log10(i);
sum = sum / (double) middle;
sum1 = sum1 / (double) (middle + 1.0);
*/
//Method 2
sum = ((0.5) * Math.log10(2 * Math.PI * (double) middle) + (double) middle * Math.log10(((double) middle / Math.E))) / (double) middle;
sum1 = ((0.5) * Math.log10(2 * Math.PI * ((double) middle + 1.0)) + ((double) middle + 1.0) * Math.log10((((double) middle + 1.0) / Math.E))) / ((double) middle + 1.0);
//This is giving wrong answer.
if (sum <= loga && sum1 > loga) {
ans = middle;
break outer;
} else if (sum > loga) {
high = middle - 1;
} else {
low = middle + 1;
}
}
out.printLine(ans + 1);