题目1444:蓝桥杯201 4年第五届真题斐波那契
创始人
2024-03-06 02:50:16
0

这篇文章是帮一个叫做【废柴成长中】的孩子写的。

题目:

这里难点应该就是在【输入为一行用空格分开的整数n m p(0

解析其实不是太麻烦,先分析,然后咱们在一点点的编写出来。

题目中给的【fib(n) = fib(n+2)-fib(n+1)】这个方法应该分数不高,不然就直接能做出来了。

我们还得对超大数据进行操作,我这里选用的是【BigInteger】,毕竟这是纯整数,求余计算结果也是纯整数或0,就是计算起来没有直接写符号计算的方便而已。

看人家给的公式:

大致先写成这样,反正看的明白就行(Σ(n)f(i))modf(m)

已知:fib(n) = fib(n+2)-fib(n+1)

推导:Σf(n) = f(n+2)-1

推算一下变量m:

如果 m>=n+2那么f(m)>Σf(n),结果是(f(n+2)-1)%p,

反之结果为(f(n+2)-1)%f(m)%p==f(n+2)%f(m)%p-1。

直接上代码,其实很多时候看debug是最快的调试方案:

package com.example.demo2022110201;
/*** @author*/import java.math.BigInteger;
import java.util.Scanner;public class Demo1 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 三变量long n, m, p;n = sc.nextLong();m = sc.nextLong();p = sc.nextLong();BigInteger bigP = BigInteger.valueOf(p);if (m >= n + 2) {BigInteger ans = fib(n + 2, bigP);System.out.println(ans.mod(bigP).longValue() - 1);} else {BigInteger fib_m = fib(m);BigInteger ans = fib(n + 2, fib_m);System.out.println(ans.mod(fib_m).mod(bigP).longValue() - 1);}sc.close();}/*** 快速矩阵求fib** @param m* @return*/private static BigInteger fib(long m) {BigInteger[][] ans = mPow(m - 2);return ans[0][0].add(ans[1][0]);}private static BigInteger fib(long m, BigInteger mod) {BigInteger[][] ans = mPow(m - 2, mod);return ans[0][0].add(ans[1][0]);}/*** 矩阵快速幂** @param n* @return*/private static BigInteger[][] mPow(long n) {BigInteger[][] a ={{BigInteger.ONE, BigInteger.ONE}, {BigInteger.ONE, BigInteger.ZERO}};//基础矩阵BigInteger[][] ans ={{BigInteger.ONE, BigInteger.ZERO}, {BigInteger.ZERO, BigInteger.ONE}};while (n != 0) {if ((n & 1) == 1) {BigInteger t1 = ans[0][0];BigInteger t2 = ans[1][0];ans[0][0] = ans[0][0].multiply(a[0][0]).add(ans[0][1].multiply(a[1][0]));ans[0][1] = t1.multiply(a[0][1]).add(ans[0][1].multiply(a[1][1]));ans[1][0] = ans[1][0].multiply(a[0][0]).add(ans[1][1].multiply(a[1][0]));ans[1][1] = t2.multiply(a[0][1]).add(ans[1][1].multiply(a[1][1]));}BigInteger t1 = a[0][0];BigInteger t2 = a[1][0];BigInteger t3 = a[0][1];a[0][0] = a[0][0].multiply(a[0][0]).add(a[0][1].multiply(a[1][0]));a[0][1] = t1.multiply(a[0][1]).add(a[0][1].multiply(a[1][1]));a[1][0] = a[1][0].multiply(t1).add(a[1][1].multiply(a[1][0]));a[1][1] = t2.multiply(t3).add(a[1][1].multiply(a[1][1]));n >>= 1;}return ans;}private static BigInteger[][] mPow(long n, BigInteger mod) {BigInteger[][] a ={{BigInteger.ONE, BigInteger.ONE}, {BigInteger.ONE, BigInteger.ZERO}};//基础矩阵BigInteger[][] ans ={{BigInteger.ONE, BigInteger.ZERO}, {BigInteger.ZERO, BigInteger.ONE}};while (n != 0) {if ((n & 1) == 1) {//结果乘当前平方BigInteger t1 = ans[0][0];BigInteger t2 = ans[1][0];ans[0][0] = ans[0][0].multiply(a[0][0]).add(ans[0][1].multiply(a[1][0])).mod(mod);ans[0][1] = t1.multiply(a[0][1]).add(ans[0][1].multiply(a[1][1])).mod(mod);ans[1][0] = ans[1][0].multiply(a[0][0]).add(ans[1][1].multiply(a[1][0])).mod(mod);ans[1][1] = t2.multiply(a[0][1]).add(ans[1][1].multiply(a[1][1])).mod(mod);}//算平方BigInteger t1 = a[0][0];BigInteger t2 = a[1][0];BigInteger t3 = a[0][1];//如果是其它语言就换成自己语言的大数处理即可。a[0][0] = a[0][0].multiply(a[0][0]).add(a[0][1].multiply(a[1][0])).mod(mod);a[0][1] = t1.multiply(a[0][1]).add(a[0][1].multiply(a[1][1])).mod(mod);a[1][0] = a[1][0].multiply(t1).add(a[1][1].multiply(a[1][0])).mod(mod);a[1][1] = t2.multiply(t3).add(a[1][1].multiply(a[1][1])).mod(mod);n >>= 1;}return ans;}
}

测试数据,我这没有平台,故而直接用测试用例的【15 11 29】,结果【25】正确

 

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...