Primer término del enésimo término dado de la ecuación F(N) = (2 * F(N – 1)) % 10^9 + 7

Dado un número entero N y un número entero F N que denota el N- ésimo término de la ecuación lineal F(N) = (2 * F(N – 1)) % M , donde M es 10 9 + 7 , la tarea es encontrar el valor de F(1) .

Ejemplos:

Entrada: N = 2, F N = 6 
Salida:
Explicación: 
Si F(1) = 3, F(2) = (2 * F(1)) % M = (2 * 3) % M = 6. 
Para F(1) = 3 la ecuación lineal dada satisface el valor de F(2). 
Por lo tanto, el valor de F(1) es 3. 

Entrada : N = 3, F N = 6 
Salida: 500000005 
Explicación: 
Si F(1) = 500000005 
F(2) = (2 * 500000005) % M = 3 
F(3) = (2 * 3) % M = 6 
Para F(1) = 500000005 la ecuación lineal dada satisface el valor de F(3). 
Por lo tanto, el valor de F(1) es 500000005

Enfoque ingenuo: el enfoque más simple para resolver este problema es probar todos los valores posibles de F(1) en el rango [1, M – 1] y verificar si algún valor satisface o no la ecuación lineal dada. Si se encuentra que es cierto, imprima el valor de F(1) .

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

Enfoque eficiente: Para optimizar el enfoque anterior, la idea se basa en las siguientes observaciones:

Dada la ecuación lineal, F(N) = 2 * F(N – 1) ——(1) 
ponga el valor de F(N – 1) = 2 * F(N – 2) en la ecuación (1) 
=>F (N) = 2 * (2 * F(N – 2)) ——–(2) 
pon el valor de F(N – 2) = 2 * F(N – 3) en la ecuación(2) 
=>F( N) = 2* (2 * (2 * F(N – 3))) 
……………………………. 
…………………………. 
=>F(N) = 2 (N – 1) F(N – (N – 1)) = 2 (N – 1) F(1) 
=>F(1) = F(N) / 2 (N – 1) 
 

Siga los pasos a continuación para resolver el problema:

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

C++

// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
#define M 1000000007
 
// Function to find the value
// of power(X, N) % M
long long power(long long x,
                long long N)
{
    // Stores the value
    // of (X ^ N) % M
    long long res = 1;
 
    // Calculate the value of
    // power(x, N) % M
    while (N > 0) {
 
        // If N is odd
        if (N & 1) {
 
            // Update res
            res = (res * x) % M;
        }
 
        // Update x
        x = (x * x) % M;
 
        // Update N
        N = N >> 1;
    }
    return res;
}
 
// Function to find modulo multiplicative
// inverse of X under modulo M
long long moduloInverse(long long X)
{
    return power(X, M - 2);
}
 
// Function to find the value of F(1)
long long F_1(long long N,
              long long F_N)
{
 
    // Stores power(2, N - 1)
    long long P_2 = power(2, N - 1);
 
    // Stores modulo multiplicative
    // inverse of P_2 under modulo M
    long long modInv = moduloInverse(P_2);
 
    // Stores the value of F(1)
    long long res;
 
    // Update res
    res = ((modInv % M) * (F_N % M)) % M;
 
    return res;
}
 
// Driver code
int main()
{
 
    long long N = 3;
    long long F_N = 6;
    cout << F_1(N, F_N);
}

Java

// Java program to implement
// the above approach
import java.util.*;
class GFG{
 
static final int M = 1000000007;
 
// Function to find the
// value of power(X, N) % M
static long power(long x,
                  long N)
{
  // Stores the value
  // of (X ^ N) % M
  long res = 1;
 
  // Calculate the value
  // of power(x, N) % M
  while (N > 0)
  {
    // If N is odd
    if (N % 2 == 1)
    {
      // Update res
      res = (res * x) % M;
    }
 
    // Update x
    x = (x * x) % M;
 
    // Update N
    N = N >> 1;
  }
  return res;
}
 
// Function to find modulo
// multiplicative inverse
// of X under modulo M
static long moduloInverse(long X)
{
  return power(X, M - 2);
}
 
// Function to find the
// value of F(1)
static long F_1(long N,
                long F_N)
{
  // Stores power(2, N - 1)
  long P_2 = power(2, N - 1);
 
  // Stores modulo multiplicative
  // inverse of P_2 under modulo M
  long modInv = moduloInverse(P_2);
 
  // Stores the value of F(1)
  long res;
 
  // Update res
  res = ((modInv % M) *
         (F_N % M)) % M;
 
  return res;
}
 
// Driver code
public static void main(String[] args)
{
  long N = 3;
  long F_N = 6;
  System.out.print(F_1(N, F_N));
}
}
 
// This code is contributed by Rajput-Ji

Python3

# Python3 program to implement
# the above approach
M = 1000000007
 
# Function to find the value
# of power(X, N) % M
def power(x, N):
     
    # Stores the value
    # of (X ^ N) % M
    res = 1
 
    # Calculate the value of
    # power(x, N) % M
    while (N > 0):
 
        # If N is odd
        if (N & 1):
 
            # Update res
            res = (res * x) % M
 
        # Update x
        x = (x * x) % M
 
        # Update N
        N = N >> 1
         
    return res
 
# Function to find modulo multiplicative
# inverse of X under modulo M
def moduloInverse(X):
     
    return power(X, M - 2)
 
#Function to find the value of F(1)
def F_1(N, F_N):
 
    # Stores power(2, N - 1)
    P_2 = power(2, N - 1)
 
    # Stores modulo multiplicative
    # inverse of P_2 under modulo M
    modInv = moduloInverse(P_2)
 
    # Stores the value of F(1)
    res = 0
 
    # Update res
    res = ((modInv % M) * (F_N % M)) % M
 
    return res
 
# Driver code
if __name__ == '__main__':
     
    N = 3
    F_N = 6
     
    print(F_1(N, F_N))
 
# This code is contributed by mohit kumar 29

C#

// C# program to implement
// the above approach
using System;
class GFG{
 
static readonly int M = 1000000007;
 
// Function to find the
// value of power(X, N) % M
static long power(long x,
                  long N)
{
  // Stores the value
  // of (X ^ N) % M
  long res = 1;
 
  // Calculate the value
  // of power(x, N) % M
  while (N > 0)
  {
    // If N is odd
    if (N % 2 == 1)
    {
      // Update res
      res = (res * x) % M;
    }
 
    // Update x
    x = (x * x) % M;
 
    // Update N
    N = N >> 1;
  }
  return res;
}
 
// Function to find modulo
// multiplicative inverse
// of X under modulo M
static long moduloInverse(long X)
{
  return power(X, M - 2);
}
 
// Function to find the
// value of F(1)
static long F_1(long N,
                long F_N)
{
  // Stores power(2, N - 1)
  long P_2 = power(2, N - 1);
 
  // Stores modulo multiplicative
  // inverse of P_2 under modulo M
  long modInv = moduloInverse(P_2);
 
  // Stores the value of F(1)
  long res;
 
  // Update res
  res = ((modInv % M) *
         (F_N % M)) % M;
 
  return res;
}
 
// Driver code
public static void Main(String[] args)
{
  long N = 3;
  long F_N = 6;
  Console.Write(F_1(N, F_N));
}
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
// JavaScript program to implement
// the above approach
var M = 100000007;
 
// Function to find the
// value of power(X, N) % M
function power(x, N)
{
 
  // Stores the value
  // of (X ^ N) % M
  var res = 1;
 
  // Calculate the value
  // of power(x, N) % M
  while (N > 0)
  {
    // If N is odd
    if (N % 2 == 1)
    {
      // Update res
      res = (res * x) % M;
    }
 
    // Update x
    x = (x * x) % M;
 
    // Update N
    N = N >> 1;
  }
  return res;
}
 
// Function to find modulo
// multiplicative inverse
// of X under modulo M
function moduloInverse( X)
{
  return power(X, M - 2);
}
 
// Function to find the
// value of F(1)
function F_1( N, F_N)
{
  // Stores power(2, N - 1)
  var P_2 = power(2, N - 1);
 
  // Stores modulo multiplicative
  // inverse of P_2 under modulo M
  var modInv = moduloInverse(P_2);
 
  // Stores the value of F(1)
  var res;
 
  // Update res
  res = ((modInv % M) *
         (F_N % M)) % M;
 
  return res;
}
 
// Driver code
var N = 3;
var F_N = 6;
document.write(F_1(N, F_N));
 
// This code is contributed by shivanisinghss2110
</script>
Producción: 

500000005

 

Complejidad temporal: O(log 2 N)  
Espacio auxiliar: O(1)

Publicación traducida automáticamente

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