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: 3
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:
- Calcule el módulo inverso multiplicativo de 2 (N – 1) bajo el módulo M , digamos modInv .
- Finalmente, imprima el valor de F(N) * modInv .
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>
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