猪猪的斐波那契


题目描述

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; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值