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 了 (随便挂一下当初学构造矩阵的链接: 传送门

A = [ 0,1 ]

    [ 1,1 ]

然后就可以把 初始矩阵乘上 n 个 A

显然初始矩阵为[ 1,1 ](设为B)

那么答案就是B*A*...*A(一共n个A)

因为矩阵乘法满足结合律

所以变一下就是B*(A^n)

然后就可以用快速幂来求A^n啦

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const ll mo=1000000007;
ll x;
struct matrix
{
    ll a[3][3];
    matrix(){ memset(a,0,sizeof(a)); }
    matrix operator * (matrix &tmp){
        matrix c;
        for(int i=1;i<=2;i++)
            for(int j=1;j<=2;j++)
                for(int k=1;k<=2;k++)
                    c.a[i][j]=(c.a[i][j]+(a[i][k]*tmp.a[k][j])%mo)%mo;
        return c;
    }//重载一下乘号
}Ans,y;
int main()
{
    Ans.a[1][1]=Ans.a[1][2]=1;
    y.a[1][2]=y.a[2][1]=y.a[2][2]=1;
    cin>>x; x--;
    while(x)
    {
        if(x&1) Ans=Ans*y;
        y=y*y;
        x>>=1;
    }//重载了乘号就可以直接快速幂了
    cout<<Ans.a[1][1];//矩阵的第一项就是答案
    return 0;
}

原文地址:https://www.cnblogs.com/LLTYYC/p/9581310.html

时间: 2024-10-07 05:35:45

P1962 斐波那契数列的相关文章

洛谷P1962 斐波那契数列

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:

luogu P1962 斐波那契数列

二次联通门 : luogu P1962 斐波那契数列 /* luogu P1962 斐波那契数列 矩阵快速幂求feibonacii 矩阵为 1 1 1 0 做N - 2次方就好 */ #include <cstdio> #define Mod 1000000007 #define Max 2 void read (long long &now) { now = 0; register char word = getchar (); while (word < '0' || wor

洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

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 说明

P1962 斐波那契数列 【矩阵快速幂】

一.题目 P1962 斐波那契数列 二.分析 比较基础的递推式转换为矩阵递推,这里因为$n$会超出$int$类型,所以需要用矩阵快速幂加快递推. 三.AC代码 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 #define ll long long 5 #define Min(a,b) ((a)>(b)?(b):(a)) 6 #define Max(a,b) ((a)>(b)?(a):(b)) 7 const ll mod

洛谷—— P1962 斐波那契数列

https://www.luogu.org/problem/show?pid=1962 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • 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:

[P1962] 斐波那契数列 (矩阵快速幂)

题意:求出 f(n) mod 1000000007 的值,n 在long long 范围内: 解法:矩阵快速幂: 1.矩阵快速幂:  = X …………① 同理:  =  X …………② 我们把②式带入①式 得:   = X 附上代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define rg registe

矩阵乘法&amp;&amp;矩阵快速幂&amp;&amp;最基本的矩阵模型——斐波那契数列

矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推 在百度百科中,矩阵的定义: 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 好,很高深对吧.那我们就更加直接地理解一下矩阵的实质:二维数组 好了这个SB都会,就不解释了 同二维数组一样,矩阵是一个'纵横排列的二维数据表格',它一般是一个n*m的二维数组,其中n*m表示它有n行m列 每一位上的数可以用下标i,j来表示,形如这样一个矩阵:

AC日记——斐波那契数列 洛谷 P1962

斐波那契数列 思路: 矩阵快速幂: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define mod 1000000007 struct MatrixType { long long ai[3][3]; void mem() { for(int i=0;i<3;i++) { for(i

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

洛谷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 说明