斐波那契數列 (矩陣快速冪)
阿新 • • 發佈:2019-02-06
f[n]=1*f[n-1]+1*f[n-2]
f[n-1]=1*f[n-1]+0*f[n-2]
即
所以
#include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <algorithm> #include <math.h> #include <set> typedef long long ll; #define mod 1000000007 using namespace std; struct matrix { ll a[5][5]; }; matrix multi(matrix x,matrix y) { matrix m; memset(m.a,0,sizeof(m.a)); int i,j,k; for(i=0;i<2;i++) { for(j=0;j<2;j++) { for(k=0;k<2;k++) { m.a[i][j]+=x.a[i][k]*y.a[k][j]; m.a[i][j]%=mod; } } } return m; } ll q_pow(ll n) { int i,j; matrix x,r; memset(x.a,0,sizeof(x.a)); memset(r.a,0,sizeof(r.a)); for(i=0;i<2;i++) r.a[i][i]=1; x.a[0][0]=1; x.a[0][1]=1; x.a[1][0]=1; x.a[1][1]=0; while(n) { if(n&1) r=multi(r,x); x=multi(x,x); n>>=1; } return r.a[0][1]; } int main () { ll n; int t; scanf("%d",&t); while(t--) { scanf("%lld",&n); printf("%lld\n",q_pow(n)); } return 0; }