4 votos

Es allí una manera más precisa modificado stirling aproximación de la fórmula para el cálculo de n!?

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);

4voto

Leon Katsnelson Puntos 274

Esto no es una respuesta a su pregunta, sólo otro enfoque. Usando la aproximación de Stirling es demasiado para el pequeño número de personas.

Tenga en cuenta que $n! > a^n$ fib $\prod_{k=1}^n { k \over a} >1$.

(Equivalentemente, $n! > a^n$ fib $\sum_{k=1}^n \ln{ k \over a} >0$. Este evita algunos problemas con el subdesbordamiento de un gran $a$.)

def f(a):
    n = 1
    s = 1.0/a
    while True:
        if s>1:
            return n
        n = n+1
        s = (s*n)/a

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X