P1962 斐波那契数列 【矩阵快速幂】
2024-08-28 22:31:25
一、题目
二、分析
比较基础的递推式转换为矩阵递推,这里因为$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 }
最新文章
- ASP.NET OWIN OAuth:遇到的2个refresh token问题
- JAVA简单工厂模式(从现实生活角度理解代码原理)
- 关于ssh上传文件
- 获取spring容器要小心的坑
- Hibernate的关联映射——单向1-1关联
- 协定类型不具有 ServiceContractAttribute 特性
- JS判断终端浏览器类型
- HTML5 前端框架和开发工具【下篇】
- Codeforces#363 Div2
- Amazon Alexa登录授权(Android)
- windows 上优雅的安装 node 和 npm
- 两种进入容器的方法 - 每天5分钟玩转 Docker 容器技术(23)
- IE浏览器-在Win7系统的安装和卸载
- MySQL报错: SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine
- Spring.factories扩展机制
- PostgreSQL使用笔记
- java程序员如何编写更好的单元测试的7个技巧
- mysql - json串新增字段
- IOS-下载动画
- JavaScript 作用域链范例