猪猪的斐波那契

来源:互联网 发布:进销存 java 编辑:程序博客网 时间:2024/05/16 23:01


题目描述

Xiaozhu学会了斐波那契数列第n项的计算方法之后,开始胡思乱想。
对于一般的二阶递推关系,给定 f[n] = a * f[n-1] + b * f[n-2]中的系数a,b,并给定初值f[0]和f[1],能否快速求出f[n]?
这里0<=n<=10^18,最后输出f[n]%(10^9+7)既可。

输入

输入多组数据,不超过10000组
每行一组数据,为5个整数f[0],f[1], a, b, n 含义见上文 1<= f[0],f[1], a, b<=10^9,n<=10^18

输出

对每一组数据输出一个整数 f[n] % (10^9+7), 表示 f[n]对(10^9+7)取余的结果

样例输入

1 1 1 1 33 9 8 2 100000000000000000

样例输出

3468290679


参考之前的一篇文章(快速幂):http://blog.csdn.net/lnlnlnying/article/details/53413615?locationNum=1&fps=1  


#include <iostream> using namespace std; #define M 1000000007  struct Matrix{ long long m[2][2];   };Matrix I = {1,0, 0,1};  Matrix matrixmul(Matrix a,Matrix b) {   Matrix c;  c.m[0][0]=((a.m[0][0]*b.m[0][0])%M+(a.m[0][1]*b.m[1][0])%M)%M;  c.m[0][1]=((a.m[0][0]*b.m[0][1])%M+(a.m[0][1]*b.m[1][1])%M)%M; c.m[1][0]=((a.m[1][0]*b.m[0][0])%M+(a.m[1][1]*b.m[1][0])%M)%M; c.m[1][1]=((a.m[1][0]*b.m[0][1])%M+(a.m[1][1]*b.m[1][1])%M)%M;     return c;   }  long long dfs(int f0,int f1,int a,int b,long long n){ Matrix c=I; Matrix m={0,1, b,a};  while(n){if (n&1)  c=matrixmul(c,m);   n>>=1; m=matrixmul(m,m); }  return ((c.m[1][0]*f0)%M+(c.m[1][1]*f1)%M)%M;      } int main(){int a,b,f0,f1;  long long n; while(cin>>f0>>f1>>a>>b>>n){   cout<<dfs(f0,f1,a,b,n-1)<<endl;  } return 0; }


0 0