斐波那契数列求法

文章目录

  • 求斐波那切数列的几个方法:
    • 经典做法:
      • 递推:
      • 动态规划
    • 矩阵快速幂
      • 原理:
      • 代码:
      • 例题:
    • 模拟过程

求斐波那切数列的几个方法:

经典做法:

众所周知:斐波那契数列的定义是f(n + 1) = f(n) + f(n - 1)
我们有两种方式来实现:一个是递归,一个是动态规划

递推:

int dfs(int n)
{if (n == 1)return 1;if (n == 2)return 2;return dfs01(n - 1) + dfs01(n - 2);
}

动态规划

int dfs03(int n)
{vec[maxn]vec[0] = 1;vec[1] = 2;int i;for (i = 2; i < n; i++){vec[i] = vec[i - 1] + vec[i - 2];}return vec[i-1];
}

矩阵快速幂

经典做法只要数一大就会超时,我们可以用矩阵快速幂进行优化,能将时间复杂度降到O(logN)
(如果全位输出斐波那契数,貌似最大能算法到93,但是如果带mod,那就可以算很大)
常用于求第n位斐波那契数的后x位(mod 10x

原理:

快速幂+矩阵
矩阵乘法:左矩阵的第一行乘以右矩阵的第一列(分别相乘),乘完后相加
单位矩阵: nn的矩阵 mat ( i , i )=1; 任何一个矩阵乘以单位矩阵就是它本身 n单位矩阵=n, 可以把单位矩阵等价为整数1。(单位矩阵用在矩阵快速幂中)
在这里插入图片描述
在斐波那契数列中:
f[n ] = 1 * f[n-1] + 1 * f [n - 2]
f[n-1] =1 * f[n-1] +0 * f [n - 2]
我们用矩阵来表示:
在这里插入图片描述
这就表示了斐波那契数列如何用矩阵来实现。

代码:

#include <iostream>  
#include <cstddef>  
#include <cstring>  
#include <vector>  
using namespace std;  
typedef long long ll;  
const int mod=10000;  
typedef vector<ll> vec;  
typedef vector<vec> mat;  
mat mul(mat &a,mat &b) 
{  mat c(a.size(),vec(b[0].size()));  for(int i=0; i<2; i++)  {  for(int j=0; j<2; j++)  {  for(int k=0; k<2; k++)  {  c[i][j]+=a[i][k]*b[k][j];  c[i][j]%=mod;  }  }  }  return c;  
}  
mat pow(mat a,ll n)  
{  mat res(a.size(),vec(a.size()));  for(int i=0; i<a.size(); i++)  res[i][i]=1;//单位矩阵;  while(n)  {  if(n&1) res=mul(res,a);  a=mul(a,a);  n/=2;  }  return res;  
}  
ll solve(ll n)  
{  mat a(2,vec(2));  a[0][0]=1;  a[0][1]=1;  a[1][0]=1;  a[1][1]=0;  a=pow(a,n);  return a[0][1];//也可以是a[1][0];  
}  
int main()  
{  ll n;  while(cin>>n&&n!=-1)  {  cout<<solve(n)<<endl;  }  return 0;  
}  
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;   
struct  matrix      //定义结构体矩阵
{ll x[2][2];
} ;
matrix  mul(matrix a,matrix b)     //矩阵乘法运算
{matrix ans;memset(ans.x,0,sizeof(ans.x));for(int i=0;i<2;i++)          //三个循环表示两个方阵相乘,可手动推写一遍{for(int j=0;j<2;j++){for(int k=0;k<2;k++){ans.x[i][j]+=a.x[i][k]*b.x[k][j];ans.x[i][j]%=mod;}}}return ans;
}
matrix quickpow(matrix p,ll n)    //矩阵快速幂,与快速幂道理方法相同
{matrix ans;for(int i=0;i<2;i++){for(int j=0;j<2;j++){if(i==j){ans.x[i][j]=1;}   //一开始初始化他为单位阵else ans.x[i][j]=0;}}while(n)//快速幂{if(n&1){ans=mul(ans,p);}p=mul(p,p);n>>=1;}return ans;
}
int main()
{matrix m;m={0,1,1,1};      ll n;cin>>n;ll ans1=0;matrix ans=quickpow(m,n-1);cout<<ans.x[1][1]<<endl;    return 0;  
}

例题:

POJ 3070

模拟过程

如果数很大,比如求1000的斐波那契数列,矩阵快速幂也求不出来,那咋办?
我们可以模拟斐波那契数列数列计算的过程,斐波那契数列的定义是f(n + 1) = f(n) + f(n - 1),我们可以手写加减,模拟进行加减运算
例题 大菲波数
H DU - 1715

#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef long long ll;
int main(){int n,q,i,j,temp=0;cin>>q;while(q--){cin>>n;char a[10010]="1",b[10010]="1",c[10010]={0};for(i=0;i<n-2;i++){int len=max(strlen(a),strlen(b));for(j=0;j<len;j++){   //模拟加法temp=0;if(a[j]>='0'){    //短的数不加temp+=a[j]-'0';}if(b[j]>='0'){temp+=b[j]-'0';}if(temp>=10){      //判断进位if(c[j]>='0'){c[j]+=temp-10;}else{c[j]+=temp-10+'0';}c[j+1]=1+'0';}else{if(c[j]>='0'){if(temp==9){   //若前位进位了,而且加上的数字是9,那么还要进位!!!c[j]='0';c[j+1]='1';}else{c[j]+=temp;}}else{c[j]+=temp+'0';}}}strcpy(a, b);strcpy(b, c);memset(c, 0, sizeof(c));}int len=strlen(b);for(i=len-1;i>=0;i--){  //倒着输出printf("%c",b[i]);}printf("\n");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.Net Core2.1中的HttpClientFactory系列一

引言&#xff1a;ASP.NET Core2.1 中出现了一个新的 HttpClientFactory 功能, 它有助于解决开发人员在使用 HttpClient 实例从其应用程序中访问外部 web 资源时可能遇到的一些常见问题。关于HttpClientFactory 到底解决了那些HttpClient的严重问题&#xff0c;下面是我罗列出来…

最大子矩阵(普通和01)

文章目录普通矩阵&#xff08;单个矩阵值为任何数&#xff09;最大子段和扩展到二维情况01矩阵&#xff08;单个矩阵值为0或1&#xff09;代码&#xff1a;普通矩阵&#xff08;单个矩阵值为任何数&#xff09; 例题&#xff1a;POJ 1074 求出其中最大的子矩阵 答案是&#x…

自动化流程开源框架BotSharp

BotSharp是一款为方便构建智能对话机器人平台而开发的开源框架&#xff0c;最大的特点是所有模型算法都是基于.NET Core开发实现&#xff0c;甚至最基本的Penn Treebank分词标准&#xff0c;都重新用C#实现了。在机器学习python占绝对优势的时代算是不可多得的项目。该项目涉及…

积极参与开源项目,促进.NET Core生态社区发展

今天早上在微信群里聊天聊到百度的SDK 已经支持.NET Core, 百度已经在3月份就支持了&#xff0c;想起当时还是我在他们的github上提的issue&#xff1a; https://github.com/Baidu-AIP/dotnet-sdk/issues/3。.NET Core生态社区的发展已经四年多时间&#xff0c;日趋完善&#x…

Service Fabric 与Ocelot 的集成

概要云应用程序通常都需要使用前端网关&#xff0c;为用户、设备或其他应用程序提供同一个入口点。 在 Service Fabric 中&#xff0c;网关可以是任意无状态服务&#xff08;如 ASP.NET Core 应用程序&#xff09; 。本文介绍了如何将Ocelot用作 Service Fabric 应用程序的网关…

图论复习——最短路

知识点 最短路径算法 最短路径树 每个点uuu的父亲为使uuu得到最短距离的前驱节点&#xff0c;若有多个&#xff0c;则取任意一个。 题目 CF449B Jzzhu and Cities Blog CF464E The Classic Problem Blog [XSY3888] 传送门 对每个点uuu&#xff0c;记d(u)d(u)d(u)表示uuu…

T-Dongle-S3开发笔记——创建工程

创建Hello world工程 打开命令面板 方法1&#xff1a;查看->命令面板 方法2&#xff1a;按F1 选择ESP-IDF:展示示例项目 创建helloworld 选择串口 选择芯片 至此可以编译下载运行了 运行后打印的信息显示flash只有2M。但是板子上电flash是W25Q32 4MB的吗 16M-bit

hdu 1576 A/B

文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;hdu 1576题目&#xff1a; 要求(A/B)%9973&#xff0c;但由于A很大&#xff0c;我们只给出n(nA%9973)(我们给定的A必能被B整除&#xff0c;且gcd(B,9973) 1)。 Input 数据的第一行是一个T&#xff0c;表示有T组数据。…

ASP.NET Core 中断请求了解一下(翻译)

本文所讲方式仅适用于托管在Kestrel Server中的应用。如果托管在IIS和IIS Express上时&#xff0c;ASP.NET Core Module(ANCM)并不会告诉ASP.NET Core在客户端断开连接时中止请求。但可喜的是&#xff0c;ANCM预计在.NET Core 2.2中会完善这一机制。1. 引言假设有一个耗时的Act…

.net core实践系列之短信服务-架构优化

前言通过前面的几篇文章&#xff0c;讲解了一个短信服务的架构设计与实现。然而初始方案并非100%完美的&#xff0c;我们仍可以对该架构做一些优化与调整。同时我也希望通过这篇文章与大家分享一下&#xff0c;我的架构设计理念。源码地址&#xff1a;https://github.com/SkyCh…

游戏 (博弈论)

https://blog.csdn.net/Mys_C_K/article/details/91443390

.NET Core中Object Pool的简单使用

前言复用&#xff0c;是一个重要的话题&#xff0c;也是我们日常开发中经常遇到的&#xff0c;不可避免的问题。举个最为简单&#xff0c;大家最为熟悉的例子&#xff0c;数据库连接池&#xff0c;就是复用数据库连接。那么复用的意义在那里呢&#xff1f;简单来说就是减少不必…

.Net Core应用框架Util介绍(三)

上篇.Net Core应用框架Util介绍&#xff08;二&#xff09;介绍了Util的开发环境&#xff0c;并让你把Demo运行起来。本文将介绍该Demo的前端Angular运行机制以及目录结构。目录结构在VS上打开Util Demo&#xff0c;会看见如下的目录结构。现代前端通常采用VS Code开发&#xf…

Ocelot简易教程(三)之主要特性及路由详解

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9664977.html上篇《Ocelot简易教程&#xff08;二&#xff09;之快速开始2》教大家如何快速跑起来一个ocelot实例项目&#xff0c;也只是简单的对Ocelot进行了配置&#xff0c;这篇文章会给大家详…

Poj 3070 Fibonacci

Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26063 Accepted: 17394文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Poj 3070 FibonacciDescription In the Fibonacci integer sequence, F0 0, F1 1, and Fn Fn − 1 Fn − 2 for…

生成函数化简技巧

一些重要式子 ∑i0∞xi11−x\sum_{i0}^{\infty}x^i\frac{1}{1-x}∑i0∞​xi1−x1​ 推论&#xff1a; 11−ax∑i0∞aixi\frac{1}{1-ax}\sum_{i0}^{\infty}a^ix^i1−ax1​∑i0∞​aixi 11−xk∑i0∞xik\frac{1}{1-x^k}\sum_{i0}^{\infty}x^{ik}1−xk1​∑i0∞​xik 11−cxk∑i0∞…

.NET西安社区 [拥抱开源,又见 .NET] 活动简报

拥抱开源, 又见 .NET」随着 .NET Core的发布和开源&#xff0c;.NET又重新回到了人们的视野。除了开源、跨平台、高性能以及优秀的语言特性&#xff0c;越来越多的第三方开源库也出现在了Github上——包括ML.NET机器学习、Xamarin移动开发平台、基于Actor模型的分布式框架Orlea…

dotnet core高吞吐Http api服务组件FastHttpApi

简介是dotNet core下基于Beetlex实现的一个高度精简化和高吞吐的HTTP API服务开源组件&#xff0c;它并没有完全实现HTTP SERVER的所有功能&#xff0c;而是只实现了在APP和WEB中提供数据服务最常用两个指令GET/SET&#xff0c;满足在应用实现JSON,PROTOBUF和MSGPACK等基于HTTP…

ASP.NET Core 中的中间件

前言由于是第一次写博客,如果您看到此文章,希望大家抱着找错误、批判的心态来看。 sky!何为中间件?在 ASP.NET Framework 中应该都知道请求管道。可参考&#xff1a;浅谈 ASP.NET 的内部机制 系列&#xff0c;个人感觉超详细。题外话&#xff1a;说到请求管道&#xff0c;就想…

.NET Core中的性能测试工具BenchmarkDotnet

背景介绍之前一篇博客中&#xff0c;我们讲解.NET Core中的CSV解析库&#xff0c;在文章的最后&#xff0c;作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能&#xff0c;本篇我们来详细介绍一下BenchmarkDotNet。原文链接&#xff1a;https://dotnetco…