Hrbust 1475 Blocks(Fibonacci)

来源:互联网 发布:阿里云邮箱 pop3 编辑:程序博客网 时间:2024/05/21 12:39
矩阵递推关系

学过代数的人可以看出,下面这个式子是成立的:
不停地利用这个式子迭代右边的列向量,会得到下面的式子:不停地利用这个式子迭代右边的列向量,会得到下面的式子:
这样,问题就转化为如何计算这个矩阵的n次方了,可以采用快速幂的方法。
那么只需对系数矩阵迭代就可以了,因为f[0]=1,f[1]=1,计算出系数矩阵的n次方之后取ans[0][0]即可。
#include<iostream>using namespace std;typedef long long LL;const int mod=1e9+7;struct Matrix{int m[2][2];}base,ans;Matrix multi(Matrix a,Matrix b){Matrix tmp;for(int i=0;i<2;i++){for(int j=0;j<2;j++){tmp.m[i][j]=0;for(int k=0;k<2;k++){tmp.m[i][j]=(tmp.m[i][j]+1LL*a.m[i][k]*b.m[k][j])%mod;}}}return tmp;}LL Fibonacci(LL n){ans.m[0][0]=ans.m[1][1]=1;ans.m[0][1]=ans.m[1][0]=0;base.m[0][0]=base.m[0][1]=base.m[1][0]=1;base.m[1][1]=0;while(n){if(n&1)ans=multi(ans,base);base=multi(base,base);n>>=1;}return ans.m[0][0];}int main(){LL n;while(scanf("%lld",&n)&&n){printf("%lld\n",Fibonacci(n));}return 0;}



0 0
原创粉丝点击