使用矩阵快速幂求斐波纳契数列

看来矩阵运算是十分好封装的,在这里计算斐波纳契数列是用到了矩阵的乘法和以矩阵作为数据类型实现的快速幂

看来矩阵甚至连结构体都不用写。。

 1 #include<cstdio>
 2 #include<vector>
 3 using std::vector;
 4 const int mod=10000;
 5 long long n;
 6 typedef vector<long long> vec;
 7 typedef vector<vec> mat;
 8 mat mul(mat &a,mat &b)
 9 {
10     mat c(a.size(),vec(b[0].size()));
11     for(int i=0;i<2;i++)
12         for(int j=0;j<2;j++)
13             for(int k=0;k<2;k++)
14             {
15                 c[i][j]+=a[i][k]*b[k][j];
16                 c[i][j]%=mod;
17             }
18     return c;
19 }
20 mat pow(mat a,long long n)
21 {
22     mat res(a.size(),vec(a.size()));
23     for(int i=0;i<a.size();i++) res[i][i]=1;
24     while(n)
25     {
26         if(n&1) res=mul(res,a);
27         a=mul(a,a);
28         n/=2;
29     }
30     return res;
31 }
32 int main()
33 {
34     while(scanf("%lld",&n)==1&&n!=-1)
35     {
36         mat a(2,vec(2));
37         a[0][0]=1;
38         a[0][1]=1;
39         a[1][0]=1;
40         a[1][1]=0;
41         a=pow(a,n);
42         printf("%lld\n",a[0][1]);
43     }
44     return 0;
45 }

猜你喜欢

转载自www.cnblogs.com/aininot260/p/9568492.html