您的位置:首页 > 其它

矩阵快速幂求斐波那契数列

2017-08-31 15:43 253 查看
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace  std;
typedef long long LL;
const int MAXN=1e4+5;
const int MOD=1e9+7;
typedef vector<int> vec;
typedef vector<vec> mat;
LL n;

mat mul(mat &A,mat &B)
{
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<A.size();i++){
for(int k=0;k<B.size();k++){
for(int j=0;j<B[0].size();j++){
C[i][j]=(C[i][j]+A[i][k]*B[k][j])%MOD;
}
}
}
return C;
}

mat pow(mat A,LL n)
{
mat B(A.size(),vec(A.size()));
for(int i=0;i<A.size();i++)  B[i][i]=1;
while(n>0)
{
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}

void solve()
{
mat A(2,vec(2));
A[0][0]=1;A[0][1]=1;
A[1][0]=1;A[1][1]=0;
A=pow(A,n);
printf("%d\n",A[1][0]);
}

int main()
{
while(scanf("%lld",&n)!=EOF)
{
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: