算法笔记_173:历届试题 斐波那契(Java)
目录
1 问题描述
f(x) = 1 .... (x=1,2)
f(x) = f(x-1) + f(x-2) .... (x>2)
对于给定的整数 n 和 m,我们希望求出:
f(1) + f(2) + ... + f(n) 的值。但这个值可能非常大,所以我们把它对 f(m) 取模。
公式如下
但这个数字依然很大,所以需要再对 p 求模。
2 解决方案
本题代码在蓝桥练习系统中测评为40分,有待优化,下面代码主要运用矩阵幂,可以提高求取斐波那契数的效率,但是依旧不满足测评数据的时间效率。
具体代码如下:
import java.math.BigInteger;
import java.util.Scanner; public class Main {
public static BigInteger[][] ZERO = {{BigInteger.ZERO,BigInteger.ZERO},
{BigInteger.ZERO,BigInteger.ZERO}};
public static BigInteger[][] KEY = {{BigInteger.ONE,BigInteger.ONE},
{BigInteger.ONE,BigInteger.ZERO}};
public static BigInteger MOD; public BigInteger[][] mergeMulti(long n) {
if(n == 0)
return ZERO;
if(n == 1)
return KEY;
if((n&1) == 0) { //当n为偶数
BigInteger[][] temp = mergeMulti(n>>1);
return matrixMulti(temp, temp);
}
//当n为奇数
BigInteger[][] temp = mergeMulti(n>>1);
return matrixMulti(matrixMulti(temp, temp), KEY);
} public BigInteger[][] matrixMulti(BigInteger[][] A, BigInteger[][] B) {
BigInteger[][] result = new BigInteger[A.length][B[0].length];
for(int i = 0;i < result.length;i++)
for(int j = 0;j < result[0].length;j++)
result[i][j] = BigInteger.ZERO;
for(int i = 0;i < A.length;i++)
for(int j = 0;j < B[0].length;j++)
for(int k = 0;k < A[0].length;k++)
result[i][j] = result[i][j].add(A[i][k].multiply(B[k][j]));
return result; } public BigInteger getResult(long n) {
if(n == 1 || n == 2)
return BigInteger.ONE;
n = n - 2;
BigInteger[][] temp = mergeMulti(n);
BigInteger[][] value = {{BigInteger.ONE, BigInteger.ONE}};
value = matrixMulti(value, temp);
return value[0][0];
} public static void main(String[] args) { Main test = new Main();
Scanner in = new Scanner(System.in);
long n = in.nextLong();
long m = in.nextLong();
MOD = in.nextBigInteger();
BigInteger result = test.getResult(n + 2).subtract(BigInteger.ONE);
result = result.mod(test.getResult(m)).mod(MOD);
System.out.println(result);
}
}
算法笔记_173:历届试题 斐波那契(Java)的更多相关文章
- Java实现 蓝桥杯 历届试题 斐波那契
试题 历届试题 斐波那契 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 - (x=1,2) f(x) = f(x-1) ...
- 算法笔记_184:历届试题 约数倍数选卡片(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数 ...
- 算法笔记_193:历届试题 连号区间数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R ...
- 算法小节(一)——斐波那契数列(java实现)
看到公司的笔试题中有一道题让写斐波那契数列,自己忙里偷闲写了一下 什么是斐波那契数列:斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
- Java算法求最大最小值,冒泡排序,斐波纳契数列一些经典算法<不断更新中>
清明在家,无聊,把一些经典的算法总结了一下. 一.求最大,最小值 Scanner input=new Scanner(System.in); int[] a={21,31,4,2,766,345,2, ...
- java程序员到底该不该了解一点算法(一个简单的递归计算斐波那契数列的案例说明算法对程序的重要性)
为什么说 “算法是程序的灵魂这句话一点也不为过”,递归计算斐波那契数列的第50项是多少? 方案一:只是单纯的使用递归,递归的那个方法被执行了250多亿次,耗时1分钟还要多. 方案二:用一个map去存储 ...
- Python初学者笔记:打印出斐波那契数列的前10项
问题:斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.- ...
- 算法笔记_177:历届试题 城市建设(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有 ...
- 算法笔记_189:历届试题 横向打印二叉树(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树 ...
随机推荐
- IO流-递归删除带内容的目录
/* * 需求:递归删除带内容的目录 * * 目录:demo * ------------------------------------------------------------------- ...
- Django1.7如何配置静态资源访问
Django是非常轻量级的Web框架,今天散仙来看下如何在Django中配置静态的资源访问路径,一个中等规模的网站,可能就会有很多静态的资源需要访问,无论是html,txt,还是压缩包,有时候访问这些 ...
- Namespace declaration statement has to be the very first statement in the script
php 中 Namespace declaration statement has to be the very first statement in the script 错误解决方法: 在PHP文 ...
- apache如何支持asp.net
Apache是目前广泛使用的一种网络服务器程序,不仅在UNIX/LINUX平台上被大量使用,而且在Windows平台上也有许多站点放弃了IIS而转向Apache..NET是微软推出的功能强大的开发技术 ...
- .Net高级技术——字符串拘留池(Intern)
一.深入理解字符串的不可变特性 string可以看做是char的只读数组.char c = s[1] C#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变.所以只能通过索引来读取指定位 ...
- 优化中的subgradient方法
哎.刚刚submit上paper比較心虚啊.无心学习.还是好好码码文字吧. subgradient介绍 subgradient中文名叫次梯度.和梯度一样,全然能够多放梯度使用.至于为什么叫子梯度,是由 ...
- datagrid在MVC中的运用02-结合搜索
本文接着上一篇,来体验给datagrid加上搜索功能.主要涉及到: ※ 把一个div与datagrid相关起来 ※ datagrid接收查询参数 ※ 查询参数的封装 效果图: 查询参数封装 分页相关的 ...
- 26复杂类型比较,使用Compare .NET objects组件
关于比较对象,在"06判等对象是否相等"中大致可以总结为: 关于比较方法: ● 实例方法Equals(object obj)既可以比较值类型,也可以比较引用类型 ● 静态方法E ...
- CMMI之功能点估算法---内部逻辑文件和外部接口文件
功能点分析的步骤 在本文中将以国际标准IFPUG(International Function Point Users Group)组织提供的功能点估算法V4.1.1为基础与大家进行讲解.如下图所示, ...
- 利用localStorage实现对ueditor编辑内容定时保存为草稿
直接看代码吧 1.引入ueditor和ueditor的使用我就不细说了 详情请戳http://blog.csdn.net/wangdianyong/article/details/39780709 2 ...