栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

蓝桥杯2014年第五届真题——斐波那契(矩阵快速幂)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯2014年第五届真题——斐波那契(矩阵快速幂)

蓝桥杯2014年第五届真题——斐波那契(矩阵快速幂)

1.题目描述
2.输入输出

3.样例输入输出

4.解题思路
思路一:暴力求解
最常规的思路,一看到斐波那契数列就用递归去写,因此可以写一个斐波那契的函数,然后调用函数来写

#include
using namespace std;
int fb(int n){
	if(n==1 || n==2) return 1;
	else return fb(n-1)+fb(n-2);
}
int main(){
	int n,m,p;
	cin>>n>>m>>p;
	long long kount=0;
	for(int i=1;i<=n;i++){
		kount+=fb(i);
	}
	cout< 

很遗憾,这样做在n非常大的时候会超时。因此如果在蓝桥杯中使用递归暴力去求解这题,只能骗到一部分分数,没办法完全ac掉。

思路二:矩阵快速幂
先了解一下快速幂,所谓快速幂,就是快速的求某一个数的多少次幂,其时间复杂度是O(logn),与朴素的O(n)相比,效率得到了极大的提高,它的基本原理是二进制
快速幂:
对于a^n , n一定可以用二进制表示。
如156(10)=10011100(2)
求解a^156,原来要进行156-1=155次乘法运算,现在的差不多运算次数就是他 二进制的长度二进制中1的个数=84=24次

快速幂模板函数

long long fastpow(long long x,long long y)
{
    long long a=1;//a为结果
    while(y)
    {
        if(y&1) a=a*x;
        x=x*x;//一个中间转移量. y每右移一次, x 就多一个平方
        y=y>>1;
    }
    return a;
}

矩阵快速幂:
1.相对于一般的快速幂,矩阵快速幂仅仅是把他的底数和乘数换成了矩阵形式,而相应的乘法运算什么的也遵循矩阵的运算法则。
2.矩阵快速幂的难点主要是在关系矩阵的构造上,只要关系矩阵构造出来了,其他的就只是套模板运算而已。

矩阵

struct node {
    int mat[15][15];//定义矩阵 
}x,y;

矩阵乘法

node mul(node x,node y){//矩阵乘法 
    node tmp;
    for(int i=0;i 

矩阵快速幂

node matpow(node x,node y,int num){//矩阵快速幂 
    while(num){
        if(num&1){
            y=mul(y,x);
        }
        x=mul(x,x);
        num=num>>1;
    }
    return y;
}

斐波那契数列关系矩阵递推式

本题参考代码(源自网络)

#include
#include
using namespace std;
typedef long long LL;
LL llmul( LL a,LL b,LL mod ) {
    a%=mod;a+=mod;a%=mod;
    b%=mod;b+=mod;b%=mod;
    if ( a>n>>m>>mod;
    cout<<( solve( n+2,m,mod )-1+mod )%mod<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/513032.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号