斐波那契

标题:斐波那契

斐波那契数列大家都非常熟悉。它的定义是: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) 取模。
公式参见【图1.png】但这个数字依然很大,所以需要再对 p 求模。

【数据格式】
输入为一行用空格分开的整数 n m p (0 < n, m, p < 10^18)
输出为1个整数

例如,如果输入:
3 5
程序应该输出:

再例如,输入:
11 29
程序应该输出:

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

首先,关于斐波那契数的求取,如果使用递归法求取,会出现远远超时;迭代法求取差不多也会超时,此处,最好使用矩阵相乘法求取第n个斐波那契数。

其次,关于求取前n个斐波那契数和的问题,利用斐波那契数的性质(网上资料参考所得):S(n) = F(n+2) - 1,其中S(n)是前n个斐波那契数的和,F(n + 2)是第n+2个斐波那契数。

最后,要考虑n,m的取值问题,经过使用计算机运算检测,一般n > 100,F(n)就会超过long型最大值,所以此处建议使用BigInteger类型,来存储斐波那契数。

下面的代码仅供参考,不保证n、m、p达到10^18数量级时,大整数类型的取余不会出现内存溢出问题哦。

import java.math.BigInteger;
import java.util.Scanner;public class Main {public static BigInteger[][] ONE = {{BigInteger.ONE, BigInteger.ONE},{BigInteger.ONE,BigInteger.ZERO}};public static BigInteger[][] ZERO = {{BigInteger.ZERO,BigInteger.ZERO},{BigInteger.ZERO,BigInteger.ZERO}};//求取矩阵ONE的n次方public BigInteger[][] getOneOfN(long n) {if(n == 0)return ZERO;if(n == 1)return ONE;if((n & 1) == 0) {   //当n为偶数时BigInteger[][] A = getOneOfN(n >> 1);return multiMatrix(A, A);}//当n为奇数时BigInteger[][] A = getOneOfN(n >> 1);return multiMatrix(multiMatrix(A, A), ONE);}//求取矩阵A*B的值public BigInteger[][] multiMatrix(BigInteger[][] A, BigInteger[][] B) {BigInteger[][] result = new BigInteger[A.length][B[0].length];for(int i = 0;i < A.length;i++)for(int j = 0;j < B[0].length;j++)result[i][j] = BigInteger.ZERO;for(int i = 0;i < A.length;i++)for(int j = 0;j < B.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;}//获取第n个斐波那契数public BigInteger getFibonacci(long n) {if(n == 1 || n == 2)return BigInteger.ONE;BigInteger[][] A  = new BigInteger[1][2];A[0][0] = BigInteger.ONE;A[0][1] = BigInteger.ONE;BigInteger[][] B = getOneOfN(n - 2);A = multiMatrix(A, B);return A[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();BigInteger p = in.nextBigInteger();BigInteger result = BigInteger.ZERO;result = test.getFibonacci(n + 2).subtract(BigInteger.ONE);result = result.mod(test.getFibonacci(m));result = result.mod(p);System.out.println(result);}}

java实现第五届蓝桥杯斐波那契相关推荐

  1. Java - 用数组求出斐波那契数列的前20项值

    斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为" ...

  2. JAVA数据结构与算法之斐波那契查找(黄金分割点)

    前言 最近面临毕业就业,在复习数据结构与算法,为了更好地掌握,加深印象,所以决定写一些博客来知识复现. 温馨提示:这篇博客可能不适合刚学数据结构的新手. 算法的简单介绍 黄金分割点是指把一条线段分割为 ...

  3. java求第k个斐波那契数_Java程序查找第n个斐波那契数

    可以通过多种方式找到第n个斐波那契数.在这里,我们将使用动态编程技术以及优化空间. 让我们看一个例子- 示例public class Demo{ static int fibo(int num){ i ...

  4. java实现第五届蓝桥杯幂一矩阵

    幂一矩阵 天才少年的邻居 atm 最近学习了线性代数相关的理论,他对"矩阵"这个概念特别感兴趣.矩阵中有个概念叫做幂零矩阵.对于一个方阵 M ,如果存在一个正整数 k 满足 M^k ...

  5. java实现第五届蓝桥杯殖民地

    殖民地 带着殖民扩张的野心,Pear和他的星际舰队登上X星球的某平原.为了评估这块土地的潜在价值,Pear把它划分成了M*N格,每个格子上用一个整数(可正可负)表示它的价值. Pear要做的事很简单- ...

  6. java实现第五届蓝桥杯LOG大侠

    LOG大侠 atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠. 一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力- 变换的规则是: 对其某个 ...

  7. java实现第五届蓝桥杯海盗分金币

    海盗分金币 有5个海盗,相约进行一次帆船比赛. 比赛中天气发生突变,他们被冲散了. 恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人. 第一个人在沙滩上发现 ...

  8. java实现第五届蓝桥杯猜字母

    猜字母 题目描述 把abcd-s共19个字母组成的序列重复拼接106次,得到长度为2014的串. 接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母. 得到的新串再进行删除 ...

  9. java实现第五届蓝桥杯绳圈

    绳圈 题目描述 今有 100 根绳子,当然会有 200 个绳头. 如果任意取绳头两两配对,把所有绳头都打结连接起来.最后会形成若干个绳圈(不考虑是否套在一起). 我们的问题是:请计算最后将形成多少个绳 ...

最新文章

  1. Python踩坑指南(第三季)
  2. Python踩坑记录
  3. linux线程创建 类函数吗,linux多线程创建时使用类成员函数作为参数
  4. 《浪潮之巅》--百年帝国读后感
  5. Qt的drawText不换行解决
  6. 这是私人的事,法官大人
  7. tinypng upload一键压缩上传工具
  8. s8 android10,旧机不是部部有 三星 Galaxy S8 将不会获得 Android 10 更新
  9. 【Flink】Flink 1.12.2 Task的调度 源码
  10. 自己在项目中写的一个Jquery插件和Jquery tab 功能
  11. 深度学习:波士顿房价预测
  12. Java进阶:SpringMVC中获取web.xml中的全局参数
  13. completion time, flow time和processing time 区别
  14. python登陆qq邮箱_python+selenium自动化测试——QQ邮箱自动登录写信
  15. kafka详细安装运行
  16. App 测试工具大全,收藏这篇就够了
  17. ECharts绘制中国地图、广西地图
  18. 利用Freessl部署免费SSL证书
  19. 有何特长及英语计算机水平怎么写,熟悉专业有何特长填写(范文篇).doc
  20. 【Python案例】OCR提取图片中的文字

热门文章

  1. JS简单验证密码强度
  2. OleDbParameter在Access数据库Insert时参数不对应的怪现象[友情提示]
  3. 速度!三家银行宣布支持鸿蒙系统
  4. 程序员的圣诞礼物:计算机寓言之秋
  5. 讲讲关于Precision 与 Recall 的概念
  6. QuickTime流式传输
  7. php爬虫爬取百度的内容,爬虫(一)抓取百度页面的内容
  8. 吴炳忠:论证的要素与结构
  9. MySQL学习Day01(狂神说Java)
  10. 并联直流稳压电源的优缺点