蓝桥杯历届试题----斐波那契(矩阵快速幂)
问题描述
斐波那契数列大家都非常熟悉。它的定义是:
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
解析:数据量超大,需要用到大数处理,在求解斐波那契数列的时候要用矩阵快速幂的方法,下面的代码只能的40分,具体原因是在求f(1) + f(2) + … + f(n)的时候没有处理好,做循环的时候不能用long n做上界,的确可以改成大数进行循环,但是这又牵扯到大数进行位运算,这里不是很明白,所以也无法给出满分的代码。
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 static 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);} else { // n为奇数BigInteger[][] temp = mergeMulti(n>>1);return matrixMulti(matrixMulti(temp, temp), KEY);}}public static BigInteger[][] matrixMulti(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 k = 0;k < A[0].length;k++) {result[i][j] = result[i][j].add(A[i][k].multiply(B[k][j]));}}} return result;}public static BigInteger sum(long n) {BigInteger cnt = BigInteger.ZERO;for (int i = 1; i <= n; i++) {cnt = cnt.add(mergeMulti(i)[0][1]);}return cnt;}public static void main(String[] args) {Scanner in = new Scanner(System.in);long n = in.nextLong();long m = in.nextLong();MOD = in.nextBigInteger();BigInteger result = sum(n);result = result.mod(mergeMulti(m)[0][1]).mod(MOD);System.out.println(result);}
}
蓝桥杯历届试题----斐波那契(矩阵快速幂)相关推荐
- 又见斐波那契~矩阵快速幂入门题
链接:https://www.nowcoder.com/acm/contest/105/G 来源:牛客网 题目描述 这是一个加强版的斐波那契数列. 给定递推式 求F(n)的值,由于这个值可能太大,请对 ...
- 「GXOI / GZOI2019」逼死强迫症——斐波那契+矩阵快速幂
题目 [题目描述] ITX351 要铺一条 $2 \times N$ 的路,为此他购买了 $N$ 块 $2 \times 1$ 的方砖.可是其中一块砖在运送的过程中从中间裂开了,变成了两块 $1 \t ...
- 蓝桥杯入门练习题斐波那契数列
蓝桥杯入门练习题 斐波那契数列 #include <stdio.h> #include <stdlib.h>int main() {long long i, j, f1 = 1 ...
- 2013蓝桥杯 黄金分割数 斐波那契数列与黄金分割比例的结合应用+模拟手算
黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜,它首次 ...
- [蓝桥杯][历届试题]国王的烦恼(反向+并查集)
问题 1435: [蓝桥杯][历届试题]国王的烦恼 时间限制: 1Sec 内存限制: 128MB 提交: 802 解决: 213 题目描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了 ...
- 蓝桥杯 - 历届试题 - 日期问题
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_33531813/article/details/79516258 </div>&l ...
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- 二分搜索,POJ2456,NYOJ 914, 区间移位-蓝桥杯-历届试题
二分搜索是不断缩减可能解的范围来得到最优解, 因为每次是折半, 所以指数爆炸有多快,这个效率就有多高 POJ2456为例, 传送门 简而言之, 就是将牛之间的距离的最小值最大化. #include&l ...
- 蓝桥杯历届试题代码参考
蓝桥杯历届试题代码参考 历届试题 核桃的数量 打印十字图 带分数 剪格子 错误票据 翻硬币 连号区间数 买不到的数目 大臣的旅费 幸运数 横向打印二叉树 危险系数 网络寻路 高僧斗法 格子刷油漆 农场 ...
最新文章
- excel vlookup多个条件匹配多列_Excel中的Vlookup函数,轻松实现多条件查询!
- 用它调试线上 bug,真得劲 | webconsole
- 新手入门 keil MDK5 建立STM32工程
- 自定义 View 功能上线,你的小程序可以更多变
- 安全开发 | 如何让Django框架中的CSRF_Token的值每次请求都不一样
- centos8.2安装mysql_centos8安装mysql
- Redis学习总结(6)——Redis 高级特性与案例学习
- ES10新特性_字符串扩展方法_trimStart--trimEnd---JavaScript_ECMAScript_ES6-ES11新特性工作笔记058
- centos 阿帕奇无法解析php_PHP之校园连接企业之路-2
- Digilent提供的PmodOLEDrgb驱动程序
- centos7+mysql5.7二进制安装
- 西瓜笔记(五上)--线性模型
- 中rsa非对称加密_HTTP的数据传输中,对称加密和非对称加密的区别是什么?
- 中国海洋大学c语言程序设计,中国海洋大学C语言级期末卷.pptx
- [书籍翻译]12周撰写期刊文章 学术出版成功指南——第 4 周:选择期刊
- 教你如何用两个队列实现一个栈
- HTML,CSS,JavaScript知识树思维导图
- 内存带宽测试与AVX指令集读写内存
- 修改文件错误:E45: 'readonly' option is set (add ! to override)
- 安装TDM-GCC时一直报错,大佬求解
热门文章
- 拉普拉斯变换_拉普拉斯变换——奇妙的数学
- hive 和mysql配置_Hive学习和配置Mysql
- win执行mysql建库脚本_linux执行mysql脚本文件连接本地windows数据库
- selenium java po模式_selenium + java po模式
- java定义一个方法,返回一个浮点数保留两位小数,考虑四舍五入的结果
- MySQL字符串类型
- C语言数据类型转换详解
- pcl通过积分图来进行法线预测
- js文件中怎么使用thymeleaf标签_007、Spring Boot集成Thymeleaf模板引擎
- forager有多少个机器人_诠视科技:VSLAM技术进展让移动机器人自主行驶有了更广阔的空间...