题目描述
北雷老中医不懂 Fibonacci,于是他定义了一种名叫Feibonaqi的数列,数列满足以下要求:
1.f(0)=0,f(1)=1
2.f(n)=2f(n-1)+f(n-2),n>1
那么问题来了,这个数列的第n项是多少呢?
(不为难大家用高精度了,你只需要将结果对1,000,000,007取模后输出即可)
输入
多组数据
每组数据一行,包含一个整数n,1<n<1,000,000,000
输出
每组数据输出一个整数,即为f(n)对1,000,000,007取模后的结果
--正文
矩阵快速幂
怎么求基础的矩阵就是使用线代的知识了(反正我是照着课本按图索骥的)
话说怎么又是1000000007..
#include <stdio.h> #include <math.h> #define MOD 1000000007 typedef struct { long M[2][2]; } Matrix; Matrix Ans,Base; long n; Matrix multi(Matrix a,Matrix b){ Matrix Tmp; int i,j,k; for (i=0;i<2;i++){ for (j=0;j<2;j++){ Tmp.M[i][j] = 0; for (k=0;k<2;k++){ Tmp.M[i][j] = ( Tmp.M[i][j] + a.M[i][k] * b.M[k][j]) % MOD; } } } return Tmp; } long Fast_Mod(long n){ Base.M[0][0] = 2; Base.M[0][1] = 1; Base.M[1][0] = 1; Base.M[1][1] = 0; Ans.M[0][0] = 1; Ans.M[0][1] = 0; Ans.M[1][0] = 0; Ans.M[1][1] = 1; while (n) { if (n & 1){ Ans = multi(Ans,Base); } Base = multi(Base,Base); n = n >> 1; } return Ans.M[0][1]; } int main(){ while (scanf("%ld",&n) != EOF){ printf("%ld ",Fast_Mod(n)); } return 0; }