Tribonacci(泰波那契)数列前n项和的求解问题
Tribonacci数列是斐波那挈数列的扩展
很有趣的,我们可以发现
这是Tribonacci数列的一些深入研究
下面是贴代码的时间了:
解法一(半产品)
这种方法就不解释了,不懂就去看看最笨的方法递归求解,而这是对递归求解的优化
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {long l = scanner.nextLong();long r = scanner.nextLong();long sum = 0;sum = sum_tribonacci(l, r);System.out.println(sum % 1000000007); // for (long i = 0; i <= 100l; i++) { // sum = sum_tribonacci(0, i); // System.out.println(i + "---------------------------" + sum // % 1000000007l); // }}}public static long sum_tribonacci(long l, long r) {long n1 = 0, n2 = 0, n3 = 0;long u1, u2;long sum = 0;if (r < 3) {return (r - l + 1);}n1 = 0;n2 = 1;n3 = 2;// n1 = 1;// n2 = 1;// n3 = 1;long n4 = 0;if (l < 3) {// for (long i = 3; i <= r; i++) {for (long i = 3; i <= r + 1; i++) {n4 = n3 + n2 + n1;n1 = n2;n2 = n3;n3 = n4;}sum = n3 - l;return sum;} else {// for (long i = 3; i <= l; i++) {for (long i = 3; i <= l; i++) {n4 = n3 + n2 + n1;n1 = n2;n2 = n3;n3 = n4;}long sum1 = n3;// sum+=n4;for (long i = l + 1; i <= r + 1; i++) {n4 = n3 + n2 + n1;n1 = n2;n2 = n3;n3 = n4;}long sum2 = n3;return sum2 - sum1;}}}
解法二
所以这里关键是要求出矩阵A
可以用前5项求出矩阵(数列{1、2、3、6、11…}依题意这是数列{1、1、1、3、5…}前n-1项的和,依然满足Tribonacci规则)
这里矩阵的n次幂,我采用的是二分法。
1 import java.math.BigDecimal;2 import java.util.Scanner;3 4 public class CopyOfMain2 {5 public static BigDecimal i1000000007 = new BigDecimal(6 String.valueOf(1000000007));7 //这里定义了四个数,其实是为了下面BigDecimal数组的初始化做准备8 public static BigDecimal i3 = new BigDecimal(String.valueOf(3));9 public static BigDecimal i2 = new BigDecimal(String.valueOf(2));10 public static BigDecimal i1 = new BigDecimal(String.valueOf(1));11 public static BigDecimal i0 = new BigDecimal(String.valueOf(0));12 13 public static void main(String[] args) {14 Scanner scanner = new Scanner(System.in);15 16 while (scanner.hasNext()) {17 18 long l = scanner.nextLong();19 long r = scanner.nextLong();20 BigDecimal[] sum = {i0,i0};21 22 23 sum = Tribonacci(l, r).divideAndRemainder(i1000000007);24 if(sum[1].longValue()<0)System.out.println(sum[1].add(i1000000007));25 else System.out.println(sum[1]);26 //这是比较笨的方法,用这种遍历的求和方式当然会超时27 // for (long i = l; i <= r; i++) {28 // sum += Tribonacci(i);29 // }30 // for(long i =0; i <= 100l; i++){31 // sum=Tribonacci(0,i);32 // System.out.println(i+"---------------------------"+sum %33 // 1000000007l);34 // }35 }36 }37 38 public static BigDecimal Tribonacci(long l, long r) {39 BigDecimal sum = i0;40 if (r < 3) {41 for (long i = l; i <= r; i++) {42 sum = new BigDecimal(String.valueOf(r - l + 1));43 }44 return sum;45 }46 BigDecimal[][] base = { { i1, i1, i0 }, { i1, i0, i1 }, { i1, i0, i0 } };47 if (l >= 3l) {48 BigDecimal[][] res1 = matrixPower(base, l - 3);49 50 BigDecimal[][] res = matrixPower(base, r - 2);51 // long[][] res = muliMatrix(res1,matrixPower(base, r- l+1));52 return (res[0][0].subtract(res1[0][0])).multiply(i3)53 .add((res[1][0].subtract(res1[1][0])).multiply(i2))54 .add((res[2][0].subtract(res1[2][0])));55 } else {56 BigDecimal[][] res = matrixPower(base, r - 2);57 return (res[0][0].multiply(i3).add(res[1][0].multiply(i2))58 .add(res[2][0]).subtract(new BigDecimal(String.valueOf(l))));59 }60 61 }62 //求Tribonacci数列每一项的方法63 // public static long Tribonacci(long n) {64 // if (n == 0l || n == 1l || n == 2l) {65 // return 1;66 // } else if (n == 3l)67 // return 3;68 // long[][] base = { { 1l, 1l, 0l}, { 1l, 0l, 1l }, { 1l, 0l, 0l } };69 // long sum = 0l;70 //71 // long[][] res = matrixPower(base, n - 3l);72 //73 // return 3l * res[0][0] + res[1][0] + res[2][0];74 // }75 76 public static BigDecimal[][] matrixPower(BigDecimal[][] base, long p) {77 BigDecimal[][] res = new BigDecimal[base.length][base[0].length];78 for (int i = 0; i < res.length; i++) {79 for (int j = 0; j< res[0].length; j++) {80 if (i == j) {81 res[i][j] = i1;82 } else83 res[i][j] = i0;84 }85 86 }87 BigDecimal tmp[][] = base;88 for (; p != 0; p >>= 1) {89 if ((p & 1) != 0) {90 res = muliMatrix(res, tmp);91 }92 tmp = muliMatrix(tmp, tmp);93 }94 return res;95 }96 97 private static BigDecimal[][] muliMatrix(BigDecimal[][] m1,98 BigDecimal[][] m2) {99 BigDecimal[][] res = new BigDecimal[m1.length][m2[0].length]; 100 for (int i = 0; i < res.length; i++) { 101 for (int j = 0; j< res[0].length; j++) { 102 res[i][j] = i0; 103 } 104 } 105 for (int i = 0; i < m1.length; i++) { 106 for (int j = 0; j < m2[0].length; j++) { 107 for (int k = 0; k < m2.length; k++) { 108 109 res[i][j] = res[i][j].add(m1[i][k].multiply(m2[k][j])).divideAndRemainder(i1000000007)[1]; 110 111 } 112 } 113 } 114 return res; 115 116 } 117 118 }
转载于:https://www.cnblogs.com/liangan/p/5438114.html
Tribonacci(泰波那契)数列前n项和的求解问题相关推荐
- 求斐波那契数列前n项的值
Description 输入n,求斐波那契数列前n项的值.斐波那契数列规律如下:1, 1, 2, 3, 5, 8, 13,21, 34,55-,从第三项开始,每一项都是前面两项的和. Input 输入 ...
- Java代码实现用for循环打印斐波那契数列前20项
/*** 需求:编写代码按照要求实现以下的功能 * 用for循环打印 1 1 2 3 5 8 13 ...(斐波那契数列前20项)* 要点提取:斐波那契数列规律:第三个数起,是前两个数之和* 思路分析 ...
- 输出斐波拉契数列前30项,每行5个
""" 功能:输出斐波拉契数列前30项,每行5个 作者:文雅兰 日期:2021年12月2日 """ #生成斐波拉契数列前30项 fib = ...
- 斐波拉契数列前n项和 斐波拉契数列第n项
此篇题解不为别的,纯属纪念,纪念一个已经且也许永远淡出我生活的人... 记不清是大二还是大三了,只记得在教四304实验室,你教我如何用矩阵快速幂来求解斐波拉契数列的第n项,然后考我怎么用类似的方法计算 ...
- 汇编:裴波那契数列前50项
汇编:裴波那契数列前50项 DATAS SEGMENTDW 200 DUP(0);一个数字需要64位,DW是16位,一共50个数字DATAS ENDSSTACKS SEGMENTDW 30 DUP(0 ...
- 每天一练——斐波那契数列前N项之和
什么是斐波那契数列? 斐波那契数列就是前两项之和会等于第三项. 斐波那契数列通常以一为起始 :1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597-- ...
- 用函数求斐波那契数列前n项和
#include <stdio.h> long fibonacci(int n) { long num; if (n == 1 || n == 2) { n ...
- Python:斐波那契数列前n项,前n项和
def fibonacci(n):a, b =1, 1for i in range(n):yield aa, b = b, a+bnum = int(input("请输入数字 n = &qu ...
- 斐波那契数列前20项
//斐波那契数列前20项0,1,1,3,5,8,13......int main(){int u=0,v=1,w,k=3;printf("%5d\n%5d\n",u,v);do{w ...
最新文章
- phpstorm支持php7吗,PHPStorm支持PHP7类型提示等新语法
- 高级运维工程师的打怪升级之路
- 在用户控件中操作父页面上的控件
- 创客常用开发板“四剑客”对比,谁最“快”?
- Android keymaster的介绍和总结
- ubuntu18.10安装octave
- Django ajax 检测用户名是否已被注册
- IntelliJ IDEA for Mac如何通过指定的关键字查找/搜索类文件
- idea输入法候选区不跟随光标
- Tomcat设置cmd窗口的title属性
- 看mysql版本信息_查看mysql 的版本信息
- [Win11]解决PS/2标准键盘带感叹号,笔记本键盘无法使用。代码19:由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个
- python编写翻译器_用Python做一个简单的翻译工具
- Rabbitmq二进制集群搭建
- C++学习记录7:定义教师类Teacher和干部类Cadre,采用多重继承的方式由这两个类派生出新类Teacher_Cadre(教师兼干部类)
- Android Verified Boot 2.0
- java 葫芦娃.rmvb,课内资源 - 基于JAVA的葫芦娃 — 最终之战
- 上元之夜,故宫亮起来!
- 在微信H5网页中获取用户基本信息
- Linux服务器移动文件命令
热门文章
- 计算机编程语言python-初学者最容易学的六种编程语言
- python利器怎么编程-Linux 利器- Python 脚本编程入门(一)
- 不懂编程可以自学python吗-我不会编程,也可能学会Python吗?
- python利器跟python一样吗-VS code for python开发利器
- python散点图拟合曲线-python曲线拟合
- python详细安装教程3.8.3-Python下载 v3.8.3 官方中文版
- 爬虫好学吗python-爬虫Python入门好学吗?学什么?
- python与php8-详解Python中Unicode和utf-8
- pythonurllib模块-python模块之urllib
- 学python用哪个软件-学python要准备什么软件-问答-阿里云开发者社区-阿里云