矩阵经典题目六:poj 3070 Fibonacci

http://poj.org/problem?id=3070

按已构造好的矩阵,那么该矩阵的n次方的右上角的数便是f[n]。

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
#define C 240
#define S 20
using namespace std;

const int maxn = 110;

struct matrix
{
	int mat[3][3];
	void init()
	{
		memset(mat,0,sizeof(mat));
		mat[1][1] = mat[2][2] = 1;
	}
}a;

matrix mul(matrix a, matrix b)
{
	matrix res;
	memset(res.mat,0,sizeof(res.mat));
	for(int i = 1; i <= 2; i++)
	{
		for(int k = 1; k <= 2; k++)
		{
			if(a.mat[i][k] == 0) continue;
			for(int j = 1; j <= 2; j++)
			{
				int t = a.mat[i][k]*b.mat[k][j];
				res.mat[i][j] = (res.mat[i][j] + t)%10000;
			}
		}
	}
	return res;
}

matrix pow(matrix a, int n)
{
	matrix res;
	res.init();

	while(n)
	{
		if(n&1)
			res = mul(res,a);
		a = mul(a,a);
		n >>= 1;
	}
	return res;
}

int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		if(n == -1) break;
		a.mat[1][1] = a.mat[1][2] = a.mat[2][1] = 1;
		a.mat[2][2] = 0;

		matrix ans = pow(a,n);

		printf("%d\n",ans.mat[1][2]);
	}
	return 0;
}
时间: 2024-10-12 17:18:02

矩阵经典题目六:poj 3070 Fibonacci的相关文章

【矩阵快速幂】POJ 3070 Fibonacci (大数 Fibonacci)(大二版)

题目链接:click here~~ 题目大意: In the Fibonacci integer sequence, F0 = 0, F1 = 1, andFn = Fn ? 1 + Fn ? 2 forn ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, - An alternative formula for the Fibonacci s

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

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

矩阵快速幂 POJ 3070 Fibonacci

题目传送门 1 /* 2 矩阵快速幂:求第n项的Fibonacci数,转置矩阵都给出,套个模板就可以了.效率很高啊 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <cmath> 8 using namespace std; 9 10 const int MAXN = 1e3 + 10; 11 const int INF = 0x3f3f3f3f;

POJ 3070 Fibonacci(矩阵快速幂)

题目链接 题意 : 用矩阵相乘求斐波那契数的后四位. 思路 :基本上纯矩阵快速幂. 1 //3070 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 6 using namespace std; 7 8 struct Matrix 9 { 10 int v[2][2]; 11 }; 12 int n; 13 14 Matrix matrix_mul(Matrix a,Matrix b) 1

POJ 3070 Fibonacci 矩阵快速求法

就是Fibonacci的矩阵算法,不过增加一点就是因为数字很大,所以需要取10000模,计算矩阵的时候取模就可以了. 本题数据不强,不过数值本来就限制整数,故此可以0ms秒了. 下面程序十分清晰了,因为分开了几个小函数了,适合初学者参考下. #include <stdio.h> const int MOD = 10000; void mulOneMatrix(int F[2][2]) { int a = F[0][0]; int b = F[1][0]; F[0][0] = (a+b)%MOD

[2016-02-04][POJ][3070][Fibonacci]

[2016-02-04][POJ][3070][Fibonacci] POJ - 3070 Fibonacci Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 + Fn ? 2 for n ≥ 2. For examp

poj 3070 Fibonacci

http://poj.org/problem?id=3070 矩阵的快速幂,二分 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 10000 5 using namespace std; 6 const int mod=10000; 7 8 int n; 9 struct node 10 { 11 int a[4][4]; 12 }; 13 14 node mu

矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)

https://www.vijos.org/p/1067 很容易推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵,其中右上角的(k-1)*(k-1)的矩阵是单位矩阵,第k行的每个数分别对应f[n-1],f[n-2],,f[n-k]的系数.然后构造一个k*1的矩阵,它的第i行代表f[i],是经过直接递推得到的.设ans[][]是第一个矩阵的n-k次幂乘上第二个矩阵,f[n]就是ans[k][1]. 注意:用__int64 #in

矩阵经典题目八:hdu 2175 How many ways??

http://acm.hdu.edu.cn/showproblem.php?pid=2157 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值 把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j.令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点).类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数.同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可.