矩阵快速幂 斐波那契数列

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct matrix{ll g[2][2];};
matrix mul(matrix a,matrix b){
    matrix c;
    c.g[0][0]=c.g[0][1]=c.g[1][0]=c.g[1][1]=0;
    for(int i=0;i<=1;i++)
    for(int j=0;j<=1;j++)
    for(int k=0;k<=1;k++)
    c.g[i][j]=(c.g[i][j]+a.g[i][k]*b.g[k][j])%p;
    return c;
}
matrix qpow(matrix a,ll n){
    matrix b;
    b.g[0][0]=b.g[1][1]=1;
    b.g[0][1]=b.g[1][0]=0;
    while(n){
        if(n&1) b=mul(b,a);
        a=mul(a,a);n>>=1;}
    return b;
}
int main(){
    ll n;
    scanf("%lld",&n);
    matrix a;
    a.g[0][0]=a.g[0][1]=a.g[1][0]=1;
    a.g[1][1]=0;
    matrix ans=qpow(a,n);
    printf("%lld\n",ans.g[0][1]);return 0;
}

https://blog.csdn.net/acm_cxq/article/details/51943875 矩阵快速幂求斐波那契数列

别人的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define mod 10000
struct Matrix
{
    long long ma[2][2];
};
Matrix mul(Matrix A,Matrix B)
{
    Matrix C;
    C.ma[0][0]=C.ma[0][1]=C.ma[1][0]=C.ma[1][1]=0;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            for(int k=0;k<2;k++)
            {
                C.ma[i][j]=(C.ma[i][j]+A.ma[i][k]*B.ma[k][j])%mod;
            }
        }
    }
    return C;
}
Matrix pow_mod(Matrix A,long long n)
{
    Matrix B;
    B.ma[0][0]=B.ma[1][1]=1;
    B.ma[0][1]=B.ma[1][0]=0;
    while(n)
    {
        if(n&1) B=mul(B,A);
        A=mul(A,A);
        n>>=1;
    }
    return B;
}
int main()
{
    long long n;
    while(~scanf("%lld",&n)&&n!=-1)
    {
        Matrix A;
        A.ma[0][0]=1;A.ma[0][1]=1;
        A.ma[1][0]=1;A.ma[1][1]=0;
        Matrix ans=pow_mod(A,n);
        printf("%lld\n",ans.ma[0][1]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/asdic/p/9609946.html

时间: 2024-10-03 18:20:17

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

快速幂--斐波那契数列

1)编写程序,求解a^b.其中b是正整数. 方法1. //一般求幂算法,O(r) public static long power1(int a,int r){ if(r<0) { System.out.println("r must be positive number!"); return -1; } if(r==0){ return 1; } long res=1; for(int i=1;i<=r;++i){ res*=a; } return res; } 这种使用

矩阵的幂 斐波那契数列

题意: 斐波那契数列是由如下递推式定义的数列 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

【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],

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

斐波那契数列 给你一个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相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

[模板]矩阵乘法(斐波那契数列)

洛谷P1962 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请你求出 f(n) mod 1000000007 的值. 输入输出格式 输入格式: ·第 1 行:一个整数 n 输出格式: 第 1 行: f(n) mod 1000000007 的值 输入输出样例 输入样例#1: 5 输出样例#1: 5 输入样例#2: 10 输出样例#2: 55 说明

快速求斐波那契数列&lt;黄金分割率&gt;

有一个固定的数学公式= =,不知道的话显然没法应用 a(n)为斐波那契数第n项 O(1)复杂度 Python def fib(self, N): golden_ratio = (1 + 5 ** 0.5) / 2 return int((golden_ratio ** N + 1) / 5 ** 0.5) 原文地址:https://www.cnblogs.com/shitianfang/p/12347963.html

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊.然而我就是那大坑,哈哈. 不说了,直接说题吧,先讨论k=1,2,3;时的解.这应该会解吧,不多说了: 从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]

P1349 广义斐波那契数列(矩阵乘法)

题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatrix} p&q\1&0\\end{bmatrix}^{n-2}=\begin{bmatrix}f_n\\f_{n-1} \end{bmatrix}\] 水题 代码 #include <bits/stdc++.h> #define int long long using namesp