斐波那契(矩阵乘法+快速幂)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct node
 5 {
 6     ll g[3][3];
 7 }a,a1,b,c,res,res1;
 8 void danwei(node &x)
 9 {
10     for(int i =1;i<=2;i++)
11         for(int j=1;j<=2;j++)
12             if(i==j) x.g[i][j]=1;
13             else x.g[i][j]=0;
14 }
15 void chengfa(node &a,node &b,node &c)
16 {
17     int i,j,k;
18     memset(c.g,0,sizeof(c.g));
19     for(i=1;i<=2;i++)
20         for(j=1;j<=2;j++)
21             for(k=1;k<=2;k++)
22                 c.g[i][j]=c.g[i][j]+a.g[i][k]*b.g[k][j];
23 }
24 void mi(node &x,int k)
25 {
26     danwei(res);
27     while(k!=0)
28     {
29         if(k%2==1)
30         {
31             chengfa(res,a,res1);
32             res=res1;    
33         }
34         chengfa(a,a,a1);
35         a=a1;
36         k/=2;
37     }
38     
39 }
40 int main()
41 {
42     int n;
43     cin>>n;
44     if(n==1)
45     {
46         cout<<1;
47         return 0;
48     }
49     memset(a.g,0,sizeof(a.g));
50     memset(b.g,0,sizeof(b.g));
51     a.g[1][1]=a.g[1][2]=a.g[2][1]=b.g[1][1]=1;
52     mi(a,n-1);
53     chengfa(res1,b,c);
54     cout<<c.g[1][1];
55 }

 

上一篇:std :: max()函数


下一篇:关于 auto 使用的一个小细节