矩阵快速幂求斐波那契

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int p=10000;
 4 typedef long long ll;
 5 int n,m;
 6
 7 struct node {
 8     ll a[2][2];
 9
10     node operator*(const node &b) const {
11         node res;
12         for (int i = 0; i < 2; i++) {
13             for (int j = 0; j < 2; j++) {
14                 res.a[i][j] = 0;
15                 for (int k = 0; k < 2; k++) {
16                     res.a[i][j] = (res.a[i][j] + a[i][k] * b.a[k][j]) % m;
17                 }
18             }
19         }
20         return res;
21     }
22 };
23
24 node pow(node b,ll c) {
25     node res;
26     res.a[0][0] = 1;
27     res.a[1][0] = 0;
28     res.a[0][1] = 0;
29     res.a[1][1] = 1;
30     while (c) {
31         if (c & 1) {
32             res = res * b;
33         }
34         c >>= 1;
35         b = b * b;
36     }
37     return res;
38 }
39
40 int main() {
41     node f;
42     f.a[0][0] = 1;
43     f.a[1][0] = 1;
44     f.a[0][1] = 1;
45     f.a[1][1] = 0;
46     scanf("%d%d", &n, &m);
47         node ans = pow(f, n);
48         printf("%lld\n", ans.a[1][0]);
49 }

原文地址:https://www.cnblogs.com/Accpted/p/11203403.html

时间: 2024-10-11 11:38:46

矩阵快速幂求斐波那契的相关文章

POJ 3070-Fibonacci(矩阵快速幂求斐波那契数列)

Fibonacci Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3070 Appoint description:  System Crawler  (2015-02-28) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 +

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数.如果后四位全为0,则输出0,否则 输出后四位去掉前导0,也...就...是...说...输出Fn%10000. 题目说的如此清楚..我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后 去掉前导0.o(╯□╰)o 还有矩阵快速幂的幂是0时要特判. P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶! #include<cstdio> #include<iostream>

[板子]矩阵快速幂求解斐波那契

在斐波那契数列之中 f[i] = 1*f[i-1]+1*f[i-2]  f[i-1] = 1*f[i-1] + 0*f[i-2]; 即 所以 就这两幅图完美诠释了斐波那契数列如何用矩阵来实现. 摘自:http://blog.csdn.net/nyist_tc_lyq/article/details/52981353 #include<bits/stdc++.h> #define LL long long using namespace std; const long long pi=10000

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以

POJ 3070 - 快速矩阵幂求斐波纳契数列

这题并不复杂. 设$A=\begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}$ 由题中公式: $\begin{pmatrix}f(n+1) & f(n)\\ f(n+1) & f(n-1)\end{pmatrix} = {\begin{pmatrix}1 & 1 \\ 1 & 0\end{pmatrix}}^{n}$ 可知,若要求f(n)只要求矩阵A的n次方即可.设我们所需的矩阵为$Answer$. 对于此题,我们可以先将

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

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

【poj3070】矩阵乘法求斐波那契数列

[题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [分析] 这是我们熟悉的斐波那契数列,原来呢我们是递推求值的嘛,当然这是最水的想法~~可是!这里的n很大诶,有10^9,for一遍肯定是不可以的咯. 于是,我学会了用矩阵乘法求斐波那契数列(貌似是很经典的). 作为初学者的我觉得十分神奇!! 好,我们来看: 我们每次存两个数f[i-1]和f[i-2],

利用矩阵求斐波那契数列

利用矩阵求斐波那契数列 flyfish 2015-8-27 矩阵(matrix)定义 一个m*n的矩阵是一个由m行n列元素排成的矩形阵列.矩阵里的元素可以是数字符号或者数学式. 形如 {acbd} 的数表称为二阶矩阵,它由二行二列组成,其中a,b,c,d称为这个矩阵的元素. 形如 {x1x2} 的有序对称为列向量Column vector 设 A={acbd} X={x1x2} 则 Y={ax1+bx2cx1+dx2} 称为二阶矩阵A与平面向量X的乘积,记为AX=Y 斐波那契(Fibonacci

poj 3070 Fibonacci(矩阵快速幂求Fibonacci数列)

题目链接: http://poj.org/problem?id=3070 题意: 我们知道斐波那契数列0 1 1 2 3 5 8 13-- 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. 思路: 这里的n很大,有10^9,for一遍肯定是不可以的. 所以要用矩阵乘法求斐波那契数列. f[n+1] = f[n]+f[n-1] f[n] = f[n] 构造以下矩阵,n次幂,mat[1][0] 就是答案 1 1 1 0 求矩