poj3070 Fibonacci(矩阵快速幂)

矩阵快速幂基本应用。

对于矩阵乘法与递推式之间的关系:

如:在斐波那契数列之中

f[i] = 1*f[i-1]+1*f[i-2]  f[i-1] = 1*f[i-1] + 0*f[i-2]。即

所以,

就这两幅图完美诠释了斐波那契数列如何用矩阵来实现。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 typedef long long ll;
 5 const int Mod=10000;
 6 struct mat{
 7     ll a[2][2];
 8 };
 9 mat mat_mul(mat x,mat y){
10     mat ans;
11     memset(ans.a,0,sizeof(ans.a));
12     for (int i=0;i<2;i++){
13         for (int j=0;j<2;j++)
14         for (int k=0;k<2;k++)
15             ans.a[i][j]=ans.a[i][j]+(x.a[i][k]*y.a[k][j])%Mod;
16     }
17     return ans;
18 }
19 ll mat_pow(ll n){
20     mat c,res;
21     c.a[0][0]=c.a[0][1]=c.a[1][0]=1;
22     c.a[1][1]=0;
23     memset(res.a,0,sizeof(res.a));
24     for (int i=0;i<2;i++) res.a[i][i]=1;
25     while (n){
26         if (n&1) res=mat_mul(res,c);
27         c=mat_mul(c,c);
28         n>>=1;
29     }
30     return res.a[0][1]%Mod;
31 }
32 int main(){
33     ll n;
34     while (cin >> n && n!=-1){
35         cout << mat_pow(n) << endl;
36     }
37     return 0;
38 }

 

posted @ 2018-02-11 17:35  Changer-qyz  阅读(188)  评论(0编辑  收藏  举报