题目描述
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 3 3 9 8 2 100000000000000000
样例输出
3 468290679
参考之前的一篇文章(快速幂):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;
}