Fibonacci数列的快速幂算法

设Fibonacci数列定义为:

请用矩阵快速幂方法,即利用以下公式求Fibonacci数列第n项。

本题不涉及高精度数。

 1 #include<stdio.h>
 2 typedef struct matrix{
 3     int m[2][2];
 4 }matrix;
 5
 6 matrix multi(matrix a, matrix b)
 7 {
 8     int i, j, k;
 9     matrix tmp;
10     for( i = 0; i < 2; ++i)
11     {
12         for( j = 0; j < 2; ++j)
13         {
14             tmp.m[i][j] = 0;
15             for( k = 0; k < 2; ++k)
16                 tmp.m[i][j] += a.m[i][k] * b.m[k][j];
17         }
18     }
19     return tmp;
20 }
21 int fast(int n)   // 求矩阵 base 的  n 次幂
22 {
23     matrix ans, base;
24     base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
25     base.m[1][1] = 0;
26     ans.m[0][0] = ans.m[1][1] = 1;  // ans 初始化为单位矩阵
27     ans.m[0][1] = ans.m[1][0] = 0;
28     while(n)
29     {
30         if(n & 1)
31         {
32             ans = multi(ans, base);
33         }
34         base = multi(base, base);
35         n >>= 1;
36     }
37     return ans.m[0][1];
38 }
39
40 int main()
41 {
42     int n;
43     while(scanf("%d", &n)!=EOF)
44     {
45         printf("%d\n", fast(n));
46     }
47     return 0;
48 }
时间: 2024-10-30 03:02:23

Fibonacci数列的快速幂算法的相关文章

hdu 1588 Gauss Fibonacci(矩阵快速幂)

Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2090    Accepted Submission(s): 903 Problem Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r

菲波那契数列的快速幂矩阵求法

时间:2014.05.15 地点:基地二楼 ----------------------------------------------------------------------- 一.背景 著名的斐波那契数列为一个这样的序列:0 1 1 2 3 5 8 13 21 34......简单的递推公式如下: F(0)=0,F(1)=1,当n>=1时,F(n)=F(n-1)+F(n-2) 显然,我们用直接的按公式递归的算法去计算该数列的第n项效率并不高,因为这样每次递归调用我们只是将规规模缩小了

HDU - 1588 Gauss Fibonacci (矩阵快速幂+二分求等比数列和)

Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very clever boy. So if you wanna me be your GF, you should solve the problem called GF~. " How good an opportunity that Gardon can not give up! The "Prob

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

hdu oj 1061 Rightmost Digit (快速幂算法)

这里首先要讲解一下快速幂算法: 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.[有读者反映在讲快速幂部分时有点含糊,所以在这里对本文进行了修改,作了更详细的补充,争取让更多的读者一目

快速乘法/快速幂 算法

快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩阵快速乘法 一.整数运算:(快速乘法.快速幂) 先说明一下基本的数学常识: (a*b) mod c == ( (a mod c) * (b mod c) ) mod c //这最后一个mod c 是为了保证结果不超过c 对于2进制,2n可用1后接n个0来表示.对于8进制,可用公式 i+3*j ==

快速幂算法的理解

首先给出代码: #include <iostream> using namespace std; //计算a^bmodn int modexp(int a,int b,int n) { int ret=1; int tmp=a; while(b) { if(b&1) ret=ret*tmp%n; tmp=tmp*tmp%n; b>>=1; } return ret; } int main() { cout<<modexp(2,10,3)<<endl;

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(矩阵快速幂)

[POJ 3070]Fibonacci(矩阵快速幂) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12333   Accepted: 8752 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 + Fn ? 2 for n ≥ 2. For example, the first ten terms of the