Número de enteros no decrecientes de n dígitos

Dado un número entero n > 0, que denota el número de dígitos, la tarea de encontrar el número total de números enteros positivos de n dígitos que no son de naturaleza decreciente. 
Un entero no decreciente es aquel en el que todos los dígitos de izquierda a derecha están en forma no decreciente. ej: 1234, 1135, ..etc. 
Nota: Los ceros iniciales también cuentan en números enteros no decrecientes, como 0000, 0001, 0023, etc., que también son números enteros no decrecientes de 4 dígitos. 
Ejemplos: 
 

Input : n = 1
Output : 10
Numbers are 0, 1, 2, ...9.

Input : n = 2
Output : 55

Input : n = 4
Output : 715

Enfoque ingenuo: generamos todos los números posibles de n dígitos y luego, para cada número, verificamos si no es decreciente o no. 
Complejidad de tiempo: (n*10^n), donde 10^n es para generar todos los números de n dígitos posibles y n es para verificar si un número en particular no es decreciente o no.
Programación Dinámica: 
Si llenamos dígitos uno por uno de izquierda a derecha, se cumplen las siguientes condiciones. 
 

  1. Si el último dígito actual es 9, podemos completar solo 9 en los lugares restantes. Entonces, solo es posible una solución si el último dígito actual es 9.
  2. Si el último dígito actual es menor que 9, entonces podemos calcular recursivamente el conteo usando la siguiente fórmula. 
     
a[i][j] = a[i-1][j] + a[i][j + 1] 
         For every digit j smaller than 9.

We consider previous length count and count
to be increased by all greater digits.

Construimos una array a[][] donde a[i][j] = recuento de todos los enteros no decrecientes de i-dígito válidos con j o mayor que j como dígito inicial. La solución se basa en las siguientes observaciones. Llenamos esta array por columnas, primero calculando a[1][9] y luego usando este valor para calcular a[2][8] y así sucesivamente. 
En cualquier momento, si deseamos calcular a[i][j] significa el número de i-dígitos enteros no decrecientes con el dígito inicial como j o un dígito mayor que j, debemos sumar a[i-1][j] ( número de enteros de i-1 dígito que deben comenzar desde j o un dígito mayor, porque en este caso si colocamos j como su dígito más a la izquierda, entonces nuestro número será i-dígito número no decreciente) y a[i][j+ 1] (número de enteros i-dígito que deben comenzar con un dígito igual a mayor que j+1). Entonces, a[i][j] = a[i-1][j] + a[i][j+1]
 

C++

// C++ program for counting n digit numbers with
// non decreasing digits
#include <bits/stdc++.h>
using namespace std;
 
// Returns count of non- decreasing numbers with
// n digits.
int nonDecNums(int n)
{
    /* a[i][j] = count of all possible number
    with i digits having leading digit as j */
    int a[n + 1][10];
 
    // Initialization of all 0-digit number
    for (int i = 0; i <= 9; i++)
        a[0][i] = 1;
 
    /* Initialization of all i-digit
    non-decreasing number leading with 9*/
    for (int i = 1; i <= n; i++)
        a[i][9] = 1;
 
    /* for all digits we should calculate
    number of ways depending upon leading
    digits*/
    for (int i = 1; i <= n; i++)
        for (int j = 8; j >= 0; j--)
            a[i][j] = a[i - 1][j] + a[i][j + 1];
 
    return a[n][0];
}
 
// driver program
int main()
{
    int n = 2;
    cout << "Non-decreasing digits = "
        << nonDecNums(n) << endl;
    return 0;
}

Java

// Java program for counting n digit numbers with
// non decreasing digits
import java.io.*;
 
class GFG {
 
    // Function that returns count of non- decreasing numbers
    // with n digits
    static int nonDecNums(int n)
    {
        // a[i][j] = count of all possible number
        // with i digits having leading digit as j
        int[][] a = new int[n + 1][10];
 
        // Initialization of all 0-digit number
        for (int i = 0; i <= 9; i++)
            a[0][i] = 1;
 
        // Initialization of all i-digit
        // non-decreasing number leading with 9
        for (int i = 1; i <= n; i++)
            a[i][9] = 1;
 
        // for all digits we should calculate
        // number of ways depending upon leading
        // digits
        for (int i = 1; i <= n; i++)
            for (int j = 8; j >= 0; j--)
                a[i][j] = a[i - 1][j] + a[i][j + 1];
 
        return a[n][0];
    }
 
    // driver program
    public static void main(String[] args)
    {
        int n = 2;
        System.out.println("Non-decreasing digits = " + nonDecNums(n));
    }
}
 
// Contributed by Pramod Kumar

Python3

# Python3 program for counting n digit
# numbers with non decreasing digits
import numpy as np
 
# Returns count of non- decreasing
# numbers with n digits.
def nonDecNums(n) :
         
    # a[i][j] = count of all possible number
    # with i digits having leading digit as j
    a = np.zeros((n + 1, 10))
 
    # Initialization of all 0-digit number
    for i in range(10) :
        a[0][i] = 1
 
    # Initialization of all i-digit
    # non-decreasing number leading with 9
    for i in range(1, n + 1) :
        a[i][9] = 1
 
    # for all digits we should calculate
    # number of ways depending upon
    # leading digits
    for i in range(1, n + 1) :
        for j in range(8, -1, -1) :
            a[i][j] = a[i - 1][j] + a[i][j + 1]
 
    return int(a[n][0])
 
# Driver Code
if __name__ == "__main__" :
 
    n = 2
    print("Non-decreasing digits = ",
                       nonDecNums(n))
 
# This code is contributed by Ryuga

C#

// C# function to find number of diagonals
// in n sided convex polygon
using System;
 
class GFG {
     
    // Function that returns count of non-
    // decreasing numbers with n digits
    static int nonDecNums(int n)
    {
        // a[i][j] = count of all possible number
        // with i digits having leading digit as j
        int[, ] a = new int[n + 1, 10];
 
        // Initialization of all 0-digit number
        for (int i = 0; i <= 9; i++)
            a[0, i] = 1;
 
        // Initialization of all i-digit
        // non-decreasing number leading with 9
        for (int i = 1; i <= n; i++)
            a[i, 9] = 1;
 
        // for all digits we should calculate
        // number of ways depending upon leading
        // digits
        for (int i = 1; i <= n; i++)
            for (int j = 8; j >= 0; j--)
                a[i, j] = a[i - 1, j] + a[i, j + 1];
 
        return a[n, 0];
    }
 
    // driver program
    public static void Main()
    {
        int n = 2;
        Console.WriteLine("Non-decreasing digits = " +
                                       nonDecNums(n));
    }
}
 
// This code is contributed by Sam007

PHP

<?php
// PHP program for counting
// n digit numbers with
// non decreasing digits
 
// Returns count of non-
// decreasing numbers with
// n digits.
 
function nonDecNums($n)
{
    /* a[i][j] = count of
    all possible number
    with i digits having
    leading digit as j */
 
    // Initialization of
    // all 0-digit number
    for ($i = 0; $i <= 9; $i++)
        $a[0][$i] = 1;
 
    /* Initialization of all
    i-digit non-decreasing
    number leading with 9*/
    for ($i = 1; $i <= $n; $i++)
        $a[$i][9] = 1;
 
    /* for all digits we should
    calculate number of ways
    depending upon leading digits*/
    for ($i = 1; $i <= $n; $i++)
        for ($j = 8; $j >= 0; $j--)
            $a[$i][$j] = $a[$i - 1][$j] +
                         $a[$i][$j + 1];
 
    return $a[$n][0];
}
 
// Driver Code
$n = 2;
echo "Non-decreasing digits = ",
            nonDecNums($n),"\n";
 
// This code is contributed by m_kit
?>

Javascript

<script>
 
    // Javascript program for counting n digit
    // numbers with non decreasing digits
     
    // Function that returns count
    // of non- decreasing numbers
    // with n digits
    function nonDecNums(n)
    {
        // a[i][j] = count of all possible number
        // with i digits having leading digit as j
        let a = new Array(n + 1)
        for (let i = 0; i < n + 1; i++)
        {
            a[i] = new Array(10);
        }
   
        // Initialization of all 0-digit number
        for (let i = 0; i <= 9; i++)
            a[0][i] = 1;
   
        // Initialization of all i-digit
        // non-decreasing number leading with 9
        for (let i = 1; i <= n; i++)
            a[i][9] = 1;
   
        // for all digits we should calculate
        // number of ways depending upon leading
        // digits
        for (let i = 1; i <= n; i++)
            for (let j = 8; j >= 0; j--)
                a[i][j] = a[i - 1][j] + a[i][j + 1];
   
        return a[n][0];
    }
     
    let n = 2;
      document.write(
    "Non-decreasing digits = " + nonDecNums(n)
    );
     
</script>
Producción

Non-decreasing digits = 55

Producción :  

Non-decreasing digits = 55

Complejidad temporal: O(10*n) equivalente a O(n).

Otro enfoque: 

Si observamos, podemos ver que el 0 debe colocarse antes del 1-9, el 1 debe colocarse antes del 2-9 y así sucesivamente. Como se nos pide encontrar números enteros no decrecientes, 111223 es un número entero no decreciente válido, lo que significa que el mismo dígito puede aparecer consecutivamente.

Ejemplo 1 : Cuando N=2, tenemos 11C9, que es igual a 55.

Ejemplo 2 : Cuando N=5, tenemos 14C9, que es igual a 2002.

C++

// CPP program To calculate Number of n-digits non-decreasing integers
//Contributed by Parishrut Kushwaha//
#include <bits/stdc++.h>
using namespace std;
 
// Returns factorial of n
long long int fact(int n)
{
    long long int res = 1;
    for (int i = 2; i <= n; i++)
        res = res * i;
    return res;
}
  
// returns nCr
long long int nCr(int n, int r)
{
    return fact(n) / (fact(r) * fact(n - r));
}
 
// Driver code
int main()
{
    int n = 2;
    cout <<"Number of Non-Decreasing digits: "<< nCr(n+9,9);
    return 0;
}

Java

// Java program To calculate Number
// of n-digits non-decreasing integers
class GFG {
 
    // Returns factorial of n
    static long fact(int n)
    {
        long res = 1;
        for (int i = 2; i <= n; i++)
            res = res * i;
        return res;
    }
 
    // returns nCr
    static long nCr(int n, int r)
    {
        return fact(n) / (fact(r) * fact(n - r));
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int n = 2;
        System.out.println(
            "Number of Non-Decreasing digits: "
            + nCr(n + 9, 9));
    }
}
 
// This code is contributed by rajsanghavi9.

Python3

# Python program To calculate Number of n-digits non-decreasing integers
#Contributed by Parishrut Kushwaha#
# Returns factorial of n
def fact(n):
     
    res = 1
    for i in range (2,n+1):
        res = res * i
    return res
     
# returns nCr
def nCr(n, r):
    return fact(n) // ((fact(r) * fact(n - r)))
 
# Driver code
n = 2
print("Number of Non-Decreasing digits: " , nCr(n+9,9))
     
# This code is contributed by shivanisinghss2110   

C#

// C# program To calculate Number
// of n-digits non-decreasing integers
using System;
 
class GFG {
 
    // Returns factorial of n
    static long fact(int n)
    {
        long res = 1;
        for (int i = 2; i <= n; i++)
            res = res * i;
        return res;
    }
 
    // returns nCr
    static long nCr(int n, int r)
    {
        return fact(n) / (fact(r) * fact(n - r));
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int n = 2;
        Console.Write("Number of Non-Decreasing digits: " + nCr(n + 9, 9));
    }
}
 
// This code is contributed by shivanisinghss2110

Javascript

<script>
// JavaScript program To calculate Number
// of n-digits non-decreasing integers
 
    // Returns factorial of n
    function fact( n)
    {
        var res = 1;
        for (var i = 2; i <= n; i++)
            res = res * i;
        return res;
    }
 
    // returns nCr
    function nCr(n, r)
    {
        return fact(n) / (fact(r) * fact(n - r));
    }
 
    // Driver code
        var n = 2;
        document.write("Number of Non-Decreasing digits: " + nCr(n + 9, 9));
 
// This code is contributed by shivanisinghss2110.
 
</script>
Producción

Number of Non-Decreasing digits: 55

Complejidad temporal:   O(n).

Complejidad espacial: O(n) .
Este artículo es una contribución de Shivam Pradhan (anuj_charm) . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *