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
5
5
10
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