Cuente números de N dígitos de modo que cada posición sea divisible por el dígito en esa posición

Dado un entero positivo N , la tarea es contar la cantidad de números de N dígitos de manera que cada índice (indexación basada en 1) en el número sea divisible por el dígito que se encuentra en ese índice. Como la cancha puede ser muy grande, imprímela módulo 10 9 + 7 .

Ejemplos:

Entrada: N = 2
Salida: 2
Explicación: Los números 11 y 12 son los únicos números de 2 dígitos que cumplen la condición.

Entrada: N = 5
Salida: 24

Enfoque ingenuo: el enfoque más simple para resolver el problema es generar todos los números de N dígitos posibles y, para cada uno de esos números, verificar si todos sus dígitos satisfacen la condición requerida o no.

Complejidad temporal: O(10 N *N)
Espacio auxiliar: O(1)

Enfoque eficiente: para optimizar el enfoque anterior, la idea es observar el hecho de que para cada posición, hay 9 opciones posibles del 1 al 9. Verifique cada opción posible y encuentre el resultado. 
Siga los pasos a continuación para resolver este problema:

  • Inicialice la variable ans como 1 para almacenar la respuesta.
  • Iterar sobre el rango [1, N] usando el índice variable y realizar las siguientes tareas:
    • Inicialice la variable, digamos opciones como 0, para almacenar la cantidad de opciones para ese índice en particular.
    • Iterar sobre el rango [1, 9] usando un dígito variable y realizar las siguientes tareas:
      • Si index%digit es igual a 0, aumente el valor de las opciones en 1.
    • Establezca el valor de ans como (ans*1LL*choices)%mod .
  • Después de realizar los pasos anteriores, imprima el valor de ans como respuesta.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
const int mod = 1e9 + 7;
 
// Function to count N-digit numbers
// such that each position is divisible
// by the digit occurring at that position
void countOfNumbers(int N)
{
    // Stores the answer.
    int ans = 1;
 
    // Iterate from indices 1 to N
    for (int index = 1; index <= N; ++index) {
 
        // Stores count of digits that can
        // be placed at the current index
        int choices = 0;
 
        // Iterate from digit 1 to 9
        for (int digit = 1; digit <= 9; ++digit) {
 
            // If index is divisible by digit
            if (index % digit == 0) {
                ++choices;
            }
        }
 
        // Multiply answer with possible choices
        ans = (ans * 1LL * choices) % mod;
    }
 
    cout << ans << endl;
}
 
// Driver Code
int main()
{
    // Given Input
    int N = 5;
 
    // Function call
    countOfNumbers(N);
 
    return 0;
}

Java

// Java program for the above approach
import java.lang.*;
import java.util.*;
  
class GFG{
 
static int mod = 1000000007;
   
// Function to count N-digit numbers
// such that each position is divisible
// by the digit occurring at that position
static void countOfNumbers(int N)
{
     
    // Stores the answer.
    int ans = 1;
 
    // Iterate from indices 1 to N
    for(int index = 1; index <= N; ++index)
    {
         
        // Stores count of digits that can
        // be placed at the current index
        int choices = 0;
 
        // Iterate from digit 1 to 9
        for(int digit = 1; digit <= 9; ++digit)
        {
             
            // If index is divisible by digit
            if (index % digit == 0)
            {
                ++choices;
            }
        }
 
        // Multiply answer with possible choices
        ans = (ans * choices) % mod;
    }
    System.out.println(ans);
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Given Input
    int N = 5;
 
    // Function call
    countOfNumbers(N);
}
}
 
// This code is contributed by shivanisinghss2110

Python3

# python program for the above approach
mod = 1000000000 + 7
 
# Function to count N-digit numbers
# such that each position is divisible
# by the digit occurring at that position
def countOfNumbers(N):
   
    # Stores the answer.
    ans = 1
     
    # Iterate from indices 1 to N
    for index in range(1, N + 1):
       
        # Stores count of digits that can
        # be placed at the current index
        choices = 0
         
        # Iterate from digit 1 to 9
        for digit in range(1, 10):
           
            # If index is divisible by digit
            if (index % digit == 0):
                choices += 1
 
        # Multiply answer with possible choices
        ans = (ans * choices) % mod
    print(ans)
 
# Driver Code
 
# Given Input
N = 5
 
# Function call
countOfNumbers(N)
 
# This code is contributed by amreshkumar3.

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
  static int mod = 1000000007;
   
// Function to count N-digit numbers
// such that each position is divisible
// by the digit occurring at that position
static void countOfNumbers(int N)
{
    // Stores the answer.
    int ans = 1;
 
    // Iterate from indices 1 to N
    for (int index = 1; index <= N; ++index) {
 
        // Stores count of digits that can
        // be placed at the current index
        int choices = 0;
 
        // Iterate from digit 1 to 9
        for (int digit = 1; digit <= 9; ++digit) {
 
            // If index is divisible by digit
            if (index % digit == 0) {
                ++choices;
            }
        }
 
        // Multiply answer with possible choices
        ans = (ans * choices) % mod;
    }
 
    Console.Write(ans);
}
 
// Driver Code
public static void Main()
{
    // Given Input
    int N = 5;
 
    // Function call
    countOfNumbers(N);
}
}
 
// This code is contributed by bgangwar59.

Javascript

<script>
 
        // JavaScript program for the above approach
        const mod = 1e9 + 7;
 
        // Function to count N-digit numbers
        // such that each position is divisible
        // by the digit occurring at that position
        function countOfNumbers(N)
        {
         
            // Stores the answer.
            let ans = 1;
 
            // Iterate from indices 1 to N
            for (let index = 1; index <= N; ++index) {
 
                // Stores count of digits that can
                // be placed at the current index
                let choices = 0;
 
                // Iterate from digit 1 to 9
                for (let digit = 1; digit <= 9; ++digit) {
 
                    // If index is divisible by digit
                    if (index % digit == 0) {
                        ++choices;
                    }
                }
 
                // Multiply answer with possible choices
                ans = (ans * 1 * choices) % mod;
            }
 
            document.write(ans);
        }
 
        // Driver Code
 
        // Given Input
        let N = 5;
 
        // Function call
        countOfNumbers(N);
 
    // This code is contributed by Potta Lokesh
    </script>
Producción: 

24

 

Complejidad de Tiempo: O(10 * N)
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por shreyasshetty788 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 *