【矩阵乘法】【快速幂】【递推】斐波那契数列&&矩乘优化递推模板

题目大意:

F[0]=0

F[1]=1

F[n+2]=F[n+1]+F[n]

求F[n] mod 104

F[n+2]
F[n+1]

=

1 1
1 0

*

F[n+1]
F[n]

记这个矩阵为A,则有:

F[n+1]
F[n]

=

An

*

F[1]
F[0]

=

An

*

1
0

然后可以快速幂

#include<cstdio>
#include<vector>
using namespace std;
typedef vector<int> vec;
typedef vector<vec> mat;
mat operator * (const mat &a,const mat &b)
{
	mat c(a.size(),vec(b[0].size()));
	for(int i=0;i<a.size();++i)
	  for(int j=0;j<b[0].size();++j)
	    for(int k=0;k<b.size();++k)
	      c[i][j]=(c[i][j]+a[i][k]*b[k][j])%10000;
	return c;
}
mat Quick_Pow(mat x,int p)
{
	if(!p)
	  {
	  	mat t(2,vec(2));
	  	t[0][0]=1; t[1][1]=1;
	  	return t;
	  }
	mat res=Quick_Pow(x,p>>1);
	res=res*res;
	if(p&1) res=res*x;
	return res;
}
int n;
int main()
{
	scanf("%d",&n);
	mat A(2,vec(2));
	A[0][0]=1; A[0][1]=1; A[1][0]=1;
	printf("%d\n",Quick_Pow(A,n)[1][0]);
	return 0;
}
时间: 2024-10-07 05:35:36

【矩阵乘法】【快速幂】【递推】斐波那契数列&&矩乘优化递推模板的相关文章

[发布] 矩阵乘法及其对于编程求斐波那契数列的某一项的应用

需要PDF的读者可以向我索要. 如果发现有翻印与用于商业用途,将予追究. ======================================= 编者注:本文中如果没有特殊说明,除法均只取整数部分,忽略小数部分. 感谢大家对我的支持!同时感谢ysy大聚聚.

递推-斐波那契数列

描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和.给出一个正整数a,要求菲波那契数列中第a个数是多少. 输入 第1行是测试数据的组数n,后面跟着n行输入.每组测试数据占1行,包括一个正整数a(1 <= a <= 20) 输出 输出有n行,每行输出对应一个输入.输出应是一个正整数,为菲波那契数列中第a个数的大小 样例输入 4 5 2 19 1 样例输出 5 1 4181 1 //听说这个数列是有公式的,然而渣渣不会,只能慢慢递推代码 #inclu

UVA1646-Edge Case(递推+斐波那契数列)

Problem UVA1646-Edge Case Time Limit: 3000 mSec Problem Description Input For each test case, you get a single line containing one positive integer: n, with 3 ≤ n ≤ 10000.  Output For each test case, a row containing the number of matchings in Cn.  S

斐波那契数列寻找mod n 循环节 模板

该代码来自ACdreamer 1 #include <iostream> 2 #include <string.h> 3 #include <algorithm> 4 #include <stdio.h> 5 #include <math.h> 6 7 using namespace std; 8 typedef unsigned long long LL; 9 10 const int M = 2; 11 12 struct Matrix 13

hdu--4549 M斐波那契数列

Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据:每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值

矩阵的幂 斐波那契数列

题意: 斐波那契数列是由如下递推式定义的数列 F0 = 0 F1 = 1 Fn+2 = Fn+1 + Fn 求这个数列第n项的值对10000取余后的结果 输入: n = 10 输出: 55 #include <cstdio> #include <vector> using namespace std; //用二维vector来表示矩阵 typedef vector<int> vec; typedef vector<vec> mat; typedef long

斐波那契数列的矩阵推导(看不懂的可以放弃矩阵了)

一.矩阵乘法 设矩阵A,B 满足 :A的列数==B的行数 矩阵乘法的运算规则: 将A矩阵的每一行乘以B矩阵的每一列 * == == 二.斐波那契数列的矩阵推导 首先我们想 Fib[i]=Fib[i-1]+Fib[i-2]; 所以斐波那契数列的第i项之与两个数也就是Fib[i-1]+Fib[i-2]有关 那么我们可以设第一个矩阵 M1= 因为我们需要利用矩阵推出斐波那契的第n项 所以我们设M1的下一项为M3 则M3=(也就是让M1的下标整体后移一位) 那么现在我们需要一个过渡矩阵M2来实现这个从M

P1962 斐波那契数列

传送门 斐波那契数列 看一眼果断递推 f[ i ] = f[ i-1 ] + f[ i-2 ] 嘛 数据一看.. 好像不行.... 那就矩阵优化一下嘛 最基础的矩阵乘法嘛 (不懂先学一下 矩阵乘法 吧) 稍微想一想: 设矩阵为 A 那么矩阵 [  f[i-2]   ,   f[i-1]  ] * A 要等于 [  f[i-1]   ,   f[i]  ](即要等于 [ f[i-1]   ,   f[i-1]+f[i-2]  ]) 在纸上稍微画一下就得到 A 了 (随便挂一下当初学构造矩阵的链接:

[洛谷1962]斐波那契数列

思路: 常见算法时矩阵快速幂,但事实上这题可以不需要矩阵快速幂. 设斐波那契数列为$f$,观察规律可以发现: 当$n$为偶数时,$f_n=(f_{n-1}\times 2+f_n)\times f_n$: 当$m$为奇数时,$f_n=f_{n+1}^2+f_n^2$. 这样只要用一个map记录已经计算过的Fibonacci数,递归求得答案即可. 再用一个hash_map跑得和标算一样快(0ms),而且内存更小. 1 #include<cstdio> 2 #include<ext/hash