fibonacci数列(二)_矩阵快速幂

描述

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 Fibonacci sequence are:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

An alternative formula for the Fibonacci sequence is

.

Given an integer n, your goal is to compute the last 4 digits of Fn.

Hint

As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by

.

Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:

.

输入
The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number −1.
输出
For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).
样例输入
0
9
1000000000
-1
样例输出
0
34
6875

【题意】

斐波那契数列可以用矩阵来求

当求第非常大的一个斐波那契数的后几位时我们可以用矩阵快速幂求解了。

#include<iostream>
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
typedef vector<int>vec;
typedef vector<vec>mat;
const int N=10000;
mat mul(mat a,mat b)//求两个矩阵的乘积
{
    mat c(a.size(),vec(b[0].size()));
    for(int i=0;i<a.size();i++)
    {
        for(int k=0;k<b.size();k++)
        {
            for(int j=0;j<b[0].size();j++)
            {
                c[i][j]=(c[i][j]+a[i][k]*b[k][j])%N;
            }
        }
    }
    return c;
}
mat get_ans(mat a,int n)//矩阵的快速幂
{
    mat b(a.size(),vec(a.size()));
    for(int i=0;i<a.size();i++)
    {
        b[i][i]=1;
    }
    while(n>0)
    {
        if(n&1) b=mul(b,a);
        a=mul(a,a);
        n>>=1;
    }
    return b;
}
int main()
{
    long long int n;
    while(~scanf("%lld",&n),n>=0)
    {
        if(n==-1) break;
        mat a(2,vec(2));
        a[0][0]=1,a[0][1]=1;
        a[1][0]=1,a[1][1]=0;
        a=get_ans(a,n);
        printf("%d\n",a[1][0]);
    }
    return 0;
}

时间: 2024-11-08 19:18:37

fibonacci数列(二)_矩阵快速幂的相关文章

nyoj_148_fibonacci数列(二)_矩阵快速幂

fibonacci数列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 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 Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … An alterna

HDOJ M斐波那契数列 4549【矩阵快速幂+快速幂+费马小定理+欧拉函数】

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2096    Accepted Submission(s): 596 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给

HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 148003    Accepted Submission(s): 35976 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

hihocoder 1151 骨牌覆盖问题 二 (矩阵快速幂)

思路见hihocoder,用的kuangbin的矩阵快速幂,一次AC,6的一笔. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <stack> #include <cmath> #include <queue> #include <set>

hihoCoder #1151 : 骨牌覆盖问题&#183;二 (矩阵快速幂,DP)

题意:给一个3*n的矩阵,要求用1*2的骨牌来填满,有多少种方案? 思路: 官网题解用的仍然是矩阵快速幂的方式.复杂度O(logn*83). 这样做需要构造一个23*23的矩阵,这个矩阵自乘n-1次,再来乘以初始矩阵init{0,0,0,0,0,0,0,1}后,变成矩阵ans{x,x,x,x,x,x,x,y},y就是答案了,而x不必管. 主要在这个矩阵的构造,假设棋盘是放竖直的(即n*3),那么考虑在第i行进行填放,需要考虑到第i-1行的所有可能的状态(注意i-2行必须是已经填满了,否则第i行无

题目1 : 骨牌覆盖问题&#183;二 (矩阵快速幂+分析状态的表示+题目的提示分析很好很经典)

题目1 : 骨牌覆盖问题·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题? 所以我们的题目是:对于3xN的棋盘,使用1x2的骨牌去覆盖一共有多少种不同的覆盖方法呢? 首先我们可以肯定,奇数长度一定是没有办法覆盖的:对于偶数长度,比如2,4,我们有下面几种覆盖方式: [week42_1.PNG] 提示:3xN骨牌覆盖 输入 第1行:1个整数N.表示棋盘长度.1≤N≤100,00

数论基础——循环节和矩阵快速幂的运用

首先我们来看一道基础题: 题目链接:HDU1005 Number Sequence 题目描述: Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 147421    Accepted Submission(s): 35814 Problem Description A number sequence is

HDOJ 6030 矩阵快速幂

链接: http://acm.hdu.edu.cn/showproblem.php?pid=6030 题意: 给一个手链染色,每连续素数个数的珠子中红色不能比蓝的多,问有多少种情况 题解: 公式为f[i]=f[i-1]+f[i-3],类似菲波那切数列,使用矩阵快速幂即可 代码: 31 typedef vector<ll> vec; 32 typedef vector<vec> mat; 33 34 mat mul(mat &A, mat &B) { 35 mat C

矩阵快速幂(Matrix_Fast_Power)

一.基础知识(1)矩阵乘法 https://blog.csdn.net/weixin_43272781/article/details/82899737 简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C 其中c[i][j]为A的第i行与B的第j列对应乘积的和,即: 代码: const int N=100; int c[N][N]; void multi(int a[][N],int b[][N],int n)//n是矩阵大小,n<N { memset(c,0,sizeof c);