matriz de potencia rápido (número de Fibonacci) Luo Gu 1962 (Código 40 puntos)

tema de fondo

Como todos sabemos, la columna de Fibonacci es de naturaleza para satisfacer las siguientes series:

F n = { 1 ( n 2 ) 

        F N - 1 + F N - 2 ( N 3 ) 

título Descripción

Por favor, encontrar  Fn mod 10 ^ 9 + 7 valor.

Formato de entrada

Alinear un número entero positivo  n

Formato de salida

Una respuesta de salida de línea entero.

entrada y salida de la muestra

Entrada # 1
5
Salida # 1
5
Entrada # 2
10
Salida # 2
55

Descripción / Consejos

[Datos] gama
de  60% de los  datos, . 1 n- . 9 2;
para  100%  de los datos, 1}. 1. n- < 2 ^ 6. 3..

 

 

código:

#include <la iostream>
#include <cstdio>
#include <la cmath>
#include <CString>
#include <la cstdlib>
#include <algoritmo>
el uso de STD espacio de nombres;
Long Long 1E9 + = MOD 7;.
struct la Matriz
{
int m [. 4] [4]; // desde este problema se número Fibonacci, sólo tendrá que utilizar 2, 4 por lo tanto abierto (no se preocupan)
}; // definir una estructura de matriz
ans matriz, res, a;

// multiplicación de matrices

Mul matriz (matriz A, la matriz B)

{
La Matrix tmp;
para (= 1 int I;. I <= 2; i ++)
for (int 1 = J;. J <= 2; J ++)
tmp.m [i] [j] = 0; // todo inicializa a cero como la multiplicación de matrices es para ser acumulado
for (int i = 1;. I <= 2; i ++)
for (int J = 1;. J <= 2; J ++)
for (int K = 1;. K <= 2; K ++)
tmp.m [i] [j] + = Am [i] [k] * Bm [k] [j]; // definición de multiplicación de matrices
tmp retorno;
}

Fast Potencia matriz //
void Quickpower (int n)
{
ans.m [. 1] [. 1] =. 1, ans.m [. 1] [2] =. 1, ans.m [2] [. 1] = 0, ANS. m [2] [2] = 0; // initialize aquí, también debe cuestionar, las columnas de Fibonacci, los dos primeros son 1,1; 0 y llenar las posiciones restantes, el resultado no se ve afectada. Aquí hay que usar ans tomar res, res y no ser capaz de ir a la enésima potencia calculada multiplicando la búsqueda de la American National Standard res ^ n, debido a que la matriz no es ley asociativa conmutativa, que iba a cambiar el resultado de
ese tiempo (N)
{
SI ( . 1 y N)
ANS sumador Mul = (ANS, RES);
RES sumador Mul = (RES, RES);
N = N >> 1;.
} // de potencia rápido de otra manera: cuando hay índice de tiempo (el índice no es 0) : Si N% 2 == 1 (N & 1), entonces tenemos que múltiples por una res de la matriz, y si es par, entonces no se toman múltiples. El siguiente paso es obtener res cuadrado, por ejemplo: 2 ^ 9 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2, a continuación, la American National Standard = 2, el resto se 8 multiplica por 2, es bastante multiplicado por 2 ^ 2 a 4, el índice dividido por 2 (N >> 1), res cuadrado

}
Int main ()
{
Largo Largo X;
CIN >> X;
SI (1 || X X == == 2.)
{
Tribunal << 1;.
Return 0;
} // si los dos primeros son directamente salida de
res. m [1] [1] = 1, res.m [1] [2] = 1, res.m [2] [1] = 1, res.m [2] [2] = 0; // no más Él explicó, este Couchu, y Fn, Fn-1 se puede obtener multiplicando + 1 la Fn, la Fn.
Quickpower (X-2); // comenzar a usar la tercera ecuación, de manera que para el ejemplo 2. Guardar F3, F2 se multiplica por res tiempo vienen, es 2-X
COUT << ans.m [1.] MOD% [1.]; // salida
}

 

Para konjac sólo el aprendizaje de potencia rápido matriz para mí, realmente difícil, y escribir durante mucho tiempo y finalmente 40. La necesidad de mejorar ah

Supongo que te gusta

Origin www.cnblogs.com/57xmz/p/12556449.html
Recomendado
Clasificación