奶牛家族(斐波那契数列的快速幂乘矩阵算法)
TX面试题:
已知有一头牛4年后开始生小牛,一次只能生一只,问20年后一共有多少头牛?
这种问题就是简单的递归:
这头奶牛在第四年后能不断生子直到第二十年,其子出生4年后又能不断生子……
代码如下:
#include <iostream>
using namespace std;int func(int n)//计算当前这头牛在n年中能创造多少后代(包括后代的后代)
{int sum = 0;if (n <= 3)return sum;for (int i = 4; i <= n; i++){sum++; //当前这头牛在第i年生的小牛sum += func(n - i + 1);//当前这头第i年出生的小牛接下来要产生的后代}return sum;
}int main()
{int s;s = func(20);cout << s + 1 << endl;system("pause");return 0;
}
法2:
其实递推公式就是斐波那契数列f(n)=f(n-1)+f(n-3);
int f(int n)
{if (n == 1)return 1;if (n == 2)return 1;if (n == 3)return 1;if (n == 4)return 2;return f(n - 1) + f(n - 3);
}int main()
{cout << f(20)<< endl;system("pause");return 0;
}
法3:
利用快速幂乘矩阵算法求解斐波那契数列。
当n很大时,用递归求解斐波那契数列效率是非常低的,所以要用快速幂乘矩阵算法求解斐波那契数列。将O(n)的时间复杂度,降到O(logn)。
class Cows {public:void Multiply(long a[3][3], long b[3][3])//矩阵相乘a=a*b{long temp[3][3] = { 0 };for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){for (int k = 0; k < 3; k++){temp[i][j] += a[i][k] * b[k][j] % 1000000007;temp[i][j] %= 1000000007;}}}for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++)a[i][j] = temp[i][j];}}//第1年:1//第2年:2//第3年:3//第4年:4//第5年:6//f(n)=f(n-1)+f(n-3)int countSum(int n) {if (n <= 4)return n;long res[3][3] = { 1,0,0,0,1,0,0,0,1 };//单位阵long base[3][3] = { 1,0,1,1,0,0,0,1,0 };//要求base矩阵的n-3次方int num = n - 3;while (num){if (num % 2){Multiply(res, base);}Multiply(base, base); //(base^2) ^ (n/2) ...(base^4) ^ (n/4)...(base^n) ^ (1)num /= 2;}return (res[0][0] * 3 + res[0][1] * 2 + res[0][2] * 1) % 1000000007;}
};
奶牛家族(斐波那契数列的快速幂乘矩阵算法)相关推荐
- 斐波拉契数列的递推递归求解算法
介绍: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...
- 浅谈斐波那契数列——从递推到矩阵乘法
说在前面 相信大家都已经知道这个中外著名的费波纳切数列了吧,关于费波那契数列有很多有趣的性质,但我们这里不讲,在这里我们只是利用斐波那契数列来引出另一个神奇的东西,矩阵乘法,递推在这里是起一个对比与铺 ...
- 快速幂求解斐波那契数列
斐波那契数列 斐波那契数列是很经典也很简单的一条题目.其满足: F n = { 1 ( n ≤ 2 ) F n − 1 + F n − 2 ( n ≥ 3 ) F_{n}= \begin{cases} ...
- 数据结构与算法--再谈递归与循环(斐波那契数列)
再谈递归与循环 在某些算法中,可能需要重复计算相同的问题,通常我们可以选择用递归或者循环两种方法.递归是一个函数内部的调用这个函数自身.循环则是通过设置计算的初始值以及终止条件,在一个范围内重复运算. ...
- 牛客18987 粉嘤花之恋(矩阵快速幂、斐波那契数列)
链接:https://ac.nowcoder.com/acm/problem/18987 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- luogu P1962 斐波那契数列
(gg直接讲的用矩阵求斐波那契数列 (原地死亡 (全程一脸懵逼 (然后看了半个点题解 首先,什么是矩阵呢 就是类似于这样的东西(里面可以填什么复数啊,实数啊的 然后矩阵的基本运算了解一下 加法很简单e ...
- CQUOJ月赛(5月)H题:zzblack与斐波那契数列
H. zzblack与斐波那契数列 Case Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld ...
- Python数学计算工具3、Python 斐波那契数列-前500项列表
百度解析: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...
- c语言斐波那契数列_从数学角度浅谈斐波那契数列
斐波那契数列历史由来已久,关于这个算法的方式也有很多,这篇讲一个由最复杂到最简单的转化. 该文主要从数学角度出发粗略谈谈. Fibonacci数列递推式为: 下面从数学角度思考这个问题,你应该还记得, ...
最新文章
- Android中的context
- 禄露禄露碌脛脥炉脛锚,学者批时下宫廷戏“就是一堆文化垃圾”
- 通过js让页面中的元素上下居中的写法
- 神经网络Drop大法真香定律
- 云效Codeup代码评审中的代码协同
- base64是哪个jar包的_涨知识 | 用maven轻松管理jar包
- java spark dataset_Spark 2.0介绍:Dataset介绍和使用
- 服务器虚拟化的主备,云服务器可以主备切换
- shell 数据类型
- 神经网络用作分类器(附代码matlab)
- ubuntu18 安装caj阅读器 wine
- 【mmdetection】测试单张图像
- tableau之仪表板与故事
- 学校的计算机是作文,未来的电脑学校作文
- java swing(GUI) MySQL实现的学生选课签到考勤系统源码开发教程
- android官方自带下拉刷新功能
- 信息竞赛:DEV C++常用技巧
- KOL营销之痛点难点
- css中字体大小font-size的设置
- 20、JAVA进阶——集合(1)