链接:https://ac.nowcoder.com/acm/contest/6357/A
来源:牛客网
题目描述
牛牛重新定义了斐波那契数列,牛牛定义f(n) = f(n-1)+f(n+1); f(1)=a, f(2)=b, 现在给定初始值 a, b,现在求第n项f(n)%1000000007的值。
其中 1<=|x|, |y|, n<=10^9
示例1
输入
1,2,3输出
1说明
f(2)=f(3)+f(1), 所以f(3) = f(2)-f(1)=2-1=1示例2
输入
-1,-2,3输出
1000000006说明
同样例1:f(3)=-1%1000000007=1000000006备注:
最终的答案应是一个非负整数,如-1 % 1000000007 = 1000000006
思路:矩阵快速幂。
求解的最初矩阵 b a; a(这个是0也行不影响) 0;
乘的矩阵 1 1; -1 0;
之前对于矩阵快速幂的理解一直不是很透彻,导致今晚上一个小时全弄这个题了。
就是你自己推的矩阵要一直乘,而不是乘原始的矩阵。
具体见代码
class Solution { typedef long long ll; const ll mod = 1e9+7; struct node { ll a[2][2]; const ll mod = 1e9+7; void operator*=(const node& y) { int i,j,k; ll t[2][2]; memset(t,0,sizeof(t)); for(i=0;i<2;i++)for(j=0;j<2;j++)for(k=0;k<2;k++) t[i][j]=(t[i][j]+(a[i][k]*y.a[k][j]+mod)%mod)%mod; for(i=0;i<2;i++)for(j=0;j<2;j++)a[i][j]=t[i][j]; } }A,S; public: ll solve(int a, int b, int n) { A.a[0][0]=A.a[0][1]=1; A.a[1][0]=-1; A.a[1][1]=0; S.a[0][0]=(b+mod)%mod; S.a[0][1]=(a+mod)%mod; S.a[1][1]=(a+mod)%mod; if(n==1)return S.a[0][1]; n-=2; for(;n;n>>=1,A*=A)if(n&1)S*=A; return S.a[0][0]; } };