【蓝桥杯】新型斐波那契数列

news/2025/1/31 9:21:24/

蓝桥杯 新型斐波那契数列

问题描述

新型斐波那契数列的第一、二、三项都为1,从第四项起每一项等于前面三项之和,求此数列第n项模m的余数。

输入格式

输入一行为两个整数n、m,用空格隔开。

输出格式

输出一行为新型斐波那契数列第n项模m的余数。

样例输入

7 3

样例输出

2

数据规模和约定

1≤n≤10^18,1≤m≤100

解题思路

对于求解斐波拉契数列的第N项,通常有三种常用的方法:递归、数组、矩阵。

因为本题的数据规模是 1 0 18 10^{18} 1018,前两种方法直接计算方法必定会超时,这里着重介绍一下矩阵解法,可以将时间复杂度降低为 O ( l g ( n ) ) O(lg(n)) O(lg(n))

定义 F i F_i Fi是新型斐波拉契数列的第i项,对于新型斐波拉契数列的前四项,能够得到:
( F 2 F 3 F 4 ) = ( 0 1 0 0 0 1 1 1 1 ) ( F 1 F 2 F 3 ) \left(\begin{array}{cccc} F_2 \\ F_3\\ F_4 \end{array}\right) = \left(\begin{array}{cccc} 0 & 1 & 0 \\ 0 & 0 & 1\\ 1 & 1 & 1 \end{array}\right) \left(\begin{array}{cccc} F_1 \\ F_2\\ F_3 \end{array}\right) F2F3F4=001101011F1F2F3
同样有:
( F 3 F 4 F 5 ) = ( 0 1 0 0 0 1 1 1 1 ) ( F 2 F 3 F 4 ) = ( 0 1 0 0 0 1 1 1 1 ) 2 ( F 1 F 2 F 3 ) \left(\begin{array}{cccc} F_3 \\ F_4\\ F_5 \end{array}\right) = \left(\begin{array}{cccc} 0 & 1 & 0 \\ 0 & 0 & 1\\ 1 & 1 & 1 \end{array}\right) \left(\begin{array}{cccc} F_2 \\ F_3\\ F_4 \end{array}\right) = \left(\begin{array}{cccc} 0 & 1 & 0 \\ 0 & 0 & 1\\ 1 & 1 & 1 \end{array}\right) ^2 \left(\begin{array}{cccc} F_1 \\ F_2\\ F_3 \end{array}\right) F3F4F5=001101011F2F3F4=0011010112F1F2F3
以此能够推出一般式:
( F n − 2 F n − 1 F n ) = ( 0 1 0 0 0 1 1 1 1 ) n − 3 ( F 1 F 2 F 3 ) \left(\begin{array}{cccc} F_{n-2} \\ F_{n-1}\\ F_n \end{array}\right) = \left(\begin{array}{cccc} 0 & 1 & 0 \\ 0 & 0 & 1\\ 1 & 1 & 1 \end{array}\right) ^{n-3} \left(\begin{array}{cccc} F_1 \\ F_2\\ F_3 \end{array}\right) Fn2Fn1Fn=001101011n3F1F2F3
而矩阵的幂次方乘法能够使用快速幂计算,能够将时间复杂度缩短为 O ( l g N ) O(lgN) O(lgN),即可解决问题。

代码

image-20220130133157179


import java.io.*;
import java.util.*;public class Main {public static class matrix {public long[][] values;matrix(){values = new long[3][3];}matrix(matrix clone){this.values = clone.values.clone();}public static matrix init(){matrix matrix = new matrix();matrix.values[0][1] = 1;matrix.values[1][2] = 1;Arrays.fill(matrix.values[2], 1);return matrix;}}// 矩阵乘法public static matrix mutiply(matrix mt1, matrix mt2){matrix temp = new matrix();for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {for (int k = 0; k < 3; ++k) {temp.values[i][j] += (mt1.values[i][k] * mt2.values[k][j]) % m;temp.values[i][j] %= m;}}}return temp;}static int m;// 矩阵幂public static matrix pow(matrix mt, long val) {--val;matrix temp = mt;while (val != 0) {if ((val & 1) == 1) {mt = mutiply(mt, temp);}val >>= 1;temp = mutiply(temp, temp);}return mt;}public static void main(String[] args) throws FileNotFoundException {Scanner cin = new Scanner(System.in);long n =  cin.nextLong();m = cin.nextInt();if (m == 1) {System.out.println(0);return;}matrix init = matrix.init();init = pow(init, n - 3);System.out.println((init.values[2][0] + init.values[2][1] + init.values[2][2]) % m);}
}

http://www.ppmy.cn/news/666501.html

相关文章

蓝桥杯——ALGO995——24点

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;就是给你四张扑克牌&#xff0c;然后尽可能的通过加减乘除和括号得到小于等于24的最大值&#xff0c;最大就是24。注意&#xff0c;除法的时候需要判断是不是整除。思路&#xff1a;猛一看&#xff0c;感觉可能…

使用7号电池的科学计算机,新奇:可以用USB充电的5号、7号电池

在大家的日常生活中&#xff0c;电池绝对是的离不开的物件。特别是AA五号电池和AAA七号电池&#xff0c;用途更加广泛&#xff0c;比如在很多家电的遥控器中、玩具、数码产品中&#xff0c;都可以找到他们的身影。为了使用方便&#xff0c;有不少人都会选择使用充电电池。但是充…

Acwing.838.堆排序

基础堆操作 题目 输入一个长度为n的整数数列&#xff0c;从小到大输出前m小的数。 输入格式 第一行包含整数n和m。 第二行包含n个整数&#xff0c;表示整数数列。 输出格式 共—行&#xff0c;包含m个整数&#xff0c;表示整数数列中前m小的数。 数据范围 1 ≤m ≤n ≤…

南孚电池持续领先同行的秘诀——集团数字化转型

注&#xff1a;本文为帆软2021数据生产力大赛获奖案例&#xff0c;未经授权禁止转载。 1 公司简介 福建南平南孚电池有限公司创立于1988年&#xff0c;系国家520户重点企业&#xff0c;国家高新技术企业&#xff0c;外经贸部重点扶持的出口企业&#xff0c;中国电池行业龙头…

互联网日报 | 苏宁家电累计销售突破20亿台;嘀嗒出行推出租车电子发票;钉钉上线“学生号”...

今日看点 ✦ 苏宁宣布&#xff1a;苏宁家电30年累计销售突破20亿台 ✦ 嘀嗒出行上线出租车电子发票&#xff0c;实时关联车内计价器 ✦ 钉钉宣布上线“学生号”&#xff1a;家长领取&#xff0c;孩子使用 ✦ 原中兴手机CEO曾学忠加盟小米&#xff0c;出任集团副总裁、手机部总裁…

5月24号作业

使用fgets计算行数 #include <stdio.h> #include <string.h> #include <errno.h>int main() {FILE *fp;int n0,count0;char Buf[1024];if((fpfopen("./file.txt","r"))NULL) //打开文件{perror("open file");return -1;}whi…

蓝桥杯ALGO-995 24点

问题描述 24点游戏是一个非常有意思的游戏&#xff0c;很流行&#xff0c;玩法很简单&#xff1a;给你4张牌&#xff0c;每张牌上有数字&#xff08;其中A代表1&#xff0c;J代表11&#xff0c;Q代表12&#xff0c;K代表13&#xff09;&#xff0c;你可以利用数学中的加、减、乘…

5号AA电池,7号AAA电池

5号AA电池、7号AAA电池 1.2V可充电镍氢电池 1.5V干电池&#xff08;碱性电池&#xff09;一次性的 不可充电重复使用 1.5V可充电锂电池&#xff08;较晚推出&#xff09; 1.5V可充电锂电池如下京东&#xff1a;https://item.jd.com/34805870254.html# 有没有1.5V的五号和七…