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

Posted dybala21

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1962 斐波那契数列 矩阵快速幂相关的知识,希望对你有一定的参考价值。

一、题目

  P1962 斐波那契数列

二、分析

  比较基础的递推式转换为矩阵递推,这里因为$n$会超出$int$类型,所以需要用矩阵快速幂加快递推。

三、AC代码

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 #define ll long long
 5 #define Min(a,b) ((a)>(b)?(b):(a))
 6 #define Max(a,b) ((a)>(b)?(a):(b))
 7 const ll mod = 1000000007;
 8 
 9 struct Matrix
10 
11     ll a[3][3];
12     Matrix()  memset(a, 0, sizeof(a)); 
13     Matrix operator*(const Matrix & b) const
14     
15         Matrix res;
16         for(int i = 0; i < 2; i ++)
17         
18             for(int j = 0; j < 2; j++)
19             
20                 for(int k = 0; k < 2; k++)
21                 
22                     res.a[i][j] = (res.a[i][j] + a[i][k] * b.a[k][j]) % mod;
23                 
24             
25         
26         return res;
27     
28  ans, base;
29 
30 void Pow(ll b)
31 
32     while(b)
33     
34         if(b&1)
35         
36             ans = ans * base;
37         
38         base = base * base;
39         b >>= 1;
40     
41 
42 
43 void init()
44 
45     base.a[0][0] = 0, base.a[0][1] = 1;
46     base.a[1][0] = 1, base.a[1][1] = 1;
47     ans.a[0][0] = 1, ans.a[0][1] = 1;
48 
49 
50 int main()
51 
52     
53     ll n;
54     while(std::cin>>n)
55     
56         if(n > 2)
57         
58             init();
59             Pow(n - 2);
60             std::cout << ans.a[0][1] << std::endl;
61         
62         else
63         
64             std::cout << "1" << std::endl;
65         
66     
67     return 0;
68 

 

以上是关于P1962 斐波那契数列 矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章

模板:矩阵快速幂(斐波那契数列)

矩阵快速幂

luogu P1962 斐波那契数列

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

HDU 4549 M斐波那契数列(矩阵快速幂&费马小定理)

斐波那契数列以及斐波那契数列的衍生形式 利用矩阵快速幂求解