试题 历届试题 斐波那契

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  斐波那契数列大家都非常熟悉。它的定义是:

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 求模。
输入格式
  输入为一行用空格分开的整数 n m p (0 < n, m, p < 10^18)
输出格式
  输出为1个整数,表示答案
样例输入
2 3 5
样例输出
0
样例输入
15 11 29
样例输出
25

import java.math.BigInteger;
import java.util.Scanner;public class 斐波那契 {static BigInteger[][] cal_fm = { { new BigInteger("1"), new BigInteger("1") },{ new BigInteger("1"), new BigInteger("0") } };static BigInteger[][] cal_sum = { { new BigInteger("2"), new BigInteger("0"), new BigInteger("-1") },{ new BigInteger("1"), new BigInteger("0"), new BigInteger("0") },{ new BigInteger("0"), new BigInteger("1"), new BigInteger("0") } };static BigInteger[][] MOD = { { new BigInteger("1") }, { new BigInteger("1") } };static BigInteger[][] SUM = { { new BigInteger("4") }, { new BigInteger("2") }, { new BigInteger("1") } };private static BigInteger[][] mult(BigInteger[][] cal_fm2, BigInteger[][] mOD2, BigInteger p, boolean flag) {int i_max = cal_fm2.length;int j_max = mOD2[0].length;int k_max = cal_fm2[0].length;if (k_max != mOD2.length) {return null;}BigInteger[][] ans = new BigInteger[i_max][j_max];for (int i = 0; i < i_max; i++) {for (int j = 0; j < j_max; j++) {BigInteger sum = new BigInteger("0");for (int k = 0; k < k_max; k++) {if (flag) {sum = (sum.mod(p)).add(cal_fm2[i][k].multiply(mOD2[k][j]).mod(p)).mod(p);} else {sum = (sum.add(cal_fm2[i][k].multiply(mOD2[k][j])));}}if (flag) {ans[i][j] = sum.mod(p);} else {ans[i][j] = sum;}}}return ans;}public static String fib(long n, long m, long p) {BigInteger mod = new BigInteger("0");BigInteger sum = new BigInteger("0");if (m > n + 2) {if (n == 1) {sum = new BigInteger("1");} else {n = n - 1;while (n != 0) {//                  System.out.println(n);if ((n & 1) == 1) {SUM = mult(cal_sum, SUM, new BigInteger(String.valueOf(p)), true);}n = n >> 1;cal_sum = mult(cal_sum, cal_sum, new BigInteger(String.valueOf(p)), true);}sum = SUM[2][0];}
//          System.out.println(sum);return sum.mod(new BigInteger(String.valueOf(p))).toString();} else {if (m == 1 || m == 2) {mod = new BigInteger("1");} else {m = m - 1;while (m != 0) {if ((m & 1) == 1) {MOD = mult(cal_fm, MOD, new BigInteger(String.valueOf(p)), false);}m = m >> 1;cal_fm = mult(cal_fm, cal_fm, new BigInteger(String.valueOf(p)), false);}mod = MOD[1][0];}if (n == 1) {sum = new BigInteger("1");} else {n = n - 1;while (n != 0) {if ((n & 1) == 1) {SUM = mult(cal_sum, SUM, mod, true);}n = n >> 1;cal_sum = mult(cal_sum, cal_sum, mod, true);}sum = SUM[2][0];}return sum.mod(new BigInteger(String.valueOf(p))).toString();}}public static void main(String[] args) {long n, m, p;Scanner scanner = new Scanner(System.in);n = scanner.nextLong();m = scanner.nextLong();p = scanner.nextLong();System.out.println(fib(n, m, p));}
}

Java实现 蓝桥杯 历届试题 斐波那契相关推荐

  1. 蓝桥杯历届试题----斐波那契(矩阵快速幂)

    问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 -. (x=1,2) f(x) = f(x-1) + f(x-2) -. (x>2) 对于给定的整数 n 和 m,我们希望求 ...

  2. 蓝桥杯入门练习题斐波那契数列

    蓝桥杯入门练习题 斐波那契数列 #include <stdio.h> #include <stdlib.h>int main() {long long i, j, f1 = 1 ...

  3. 2013蓝桥杯 黄金分割数 斐波那契数列与黄金分割比例的结合应用+模拟手算

    黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜,它首次 ...

  4. 【Java】蓝桥杯历届试题 题解

    历届试题 PREV-1 核桃的数量 历届试题 PREV-2 打印十字图 历届试题 PREV-3 带分数 历届试题 PREV-4 剪格子 历届试题 PREV-5 错误票据 历届试题 PREV-6 翻硬币 ...

  5. Java实现蓝桥杯历届试题兰顿蚂蚁

    历届试题 兰顿蚂蚁 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其 ...

  6. Java实现 蓝桥杯 历届试题 核桃的数量

    历届试题 核桃的数量 时间限制:1.0s 内存限制:256.0MB 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的 ...

  7. Java实现 蓝桥杯 历届试题 带分数

    问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...

  8. Java实现 蓝桥杯 历届试题 波动数列

    问题描述 观察这个数列: 1 3 0 2 -1 1 -2 - 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b ...

  9. Java实现 蓝桥杯 历届试题 城市建设

    问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有n个比较重要的地点,市长希望这些地点重点被考虑.现在 ...

  10. Java实现 蓝桥杯 历届试题 矩阵翻硬币

    问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转. 其 ...

最新文章

  1. PHP 利用AJAX获取网页并输出(原创自Zjmainstay)
  2. 【swjtu】数据结构实验6_二叉树的遍历算法
  3. 计算机网络系统中每台计算机的地位是什么,东北师范计算机应用基础15秋在线作业1满分答案...
  4. 融云php sdk下载安装,LICENSE · 融云 RongCloud/server-sdk-php-composer - Gitee.com
  5. Spring Boot Transaction 源码解析(一)
  6. SAP Spartacus里px,em和rem的应用
  7. ASP.NET Core快速入门(第3章:依赖注入)--学习笔记
  8. docker镜像-运行
  9. 图像处理-HSL彩色图像均衡化
  10. 在Centos操作系统下安装mysql8.0
  11. ul阻燃标准有几个等级_UL阻燃标准
  12. CDISC SDTM AE domain学习笔记 - 1
  13. windows脚本编写及使用方法
  14. Android进阶之路 - 解决部分手机拍照之后图片被旋转的问题
  15. 信用卡的使用之二——哪些情况下银行降额
  16. Image2icon for Mac(icns图标转换制作工具)
  17. 中国工程师成功扩容苹果 MacBook M1
  18. Eclipse Console 乱码
  19. C++ P1282 多米诺骨牌
  20. 无法启动此程序因为计算机中丢失d3dcompiler_47.dll

热门文章

  1. 四川规定除了买无人机需要实名之外,还要考取无人机“驾照”
  2. 软件工程期末学习报告与心得体会总结
  3. 建设施工发包方能否以承包方未开具发票拒绝支付工程款
  4. 电气考研300分就可以上岸的B级211强校
  5. 学生喜欢在计算机教室上课翻译成英语,远程教室,long-distance classroom,音标,读音,翻译,英文例句,英语词典...
  6. 语音识别训练和解码——声学特征与文本标记如何对齐
  7. haizei c++ 试听课程知识点 day1
  8. 百度AI开发者大会之后的24小时
  9. 国庆三亚自由行(Part 3 第三日之游泳按摩)
  10. opencv puttext 文本框填充颜色