P1962 斐波那契数列 矩阵快速幂
Posted dybala21
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 斐波那契数列 矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章