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项和的求解问题相关推荐

  1. 求斐波那契数列前n项的值

    Description 输入n,求斐波那契数列前n项的值.斐波那契数列规律如下:1, 1, 2, 3, 5, 8, 13,21, 34,55-,从第三项开始,每一项都是前面两项的和. Input 输入 ...

  2. Java代码实现用for循环打印斐波那契数列前20项

    /*** 需求:编写代码按照要求实现以下的功能 * 用for循环打印 1 1 2 3 5 8 13 ...(斐波那契数列前20项)* 要点提取:斐波那契数列规律:第三个数起,是前两个数之和* 思路分析 ...

  3. 输出斐波拉契数列前30项,每行5个

    """ 功能:输出斐波拉契数列前30项,每行5个 作者:文雅兰 日期:2021年12月2日 """ #生成斐波拉契数列前30项 fib = ...

  4. 斐波拉契数列前n项和 斐波拉契数列第n项

    此篇题解不为别的,纯属纪念,纪念一个已经且也许永远淡出我生活的人... 记不清是大二还是大三了,只记得在教四304实验室,你教我如何用矩阵快速幂来求解斐波拉契数列的第n项,然后考我怎么用类似的方法计算 ...

  5. 汇编:裴波那契数列前50项

    汇编:裴波那契数列前50项 DATAS SEGMENTDW 200 DUP(0);一个数字需要64位,DW是16位,一共50个数字DATAS ENDSSTACKS SEGMENTDW 30 DUP(0 ...

  6. 每天一练——斐波那契数列前N项之和

    什么是斐波那契数列? 斐波那契数列就是前两项之和会等于第三项. 斐波那契数列通常以一为起始 :1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597-- ...

  7. 用函数求斐波那契数列前n项和

    #include <stdio.h> long fibonacci(int n) {     long num;     if (n == 1 || n == 2) {         n ...

  8. Python:斐波那契数列前n项,前n项和

    def fibonacci(n):a, b =1, 1for i in range(n):yield aa, b = b, a+bnum = int(input("请输入数字 n = &qu ...

  9. 斐波那契数列前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 ...

最新文章

  1. phpstorm支持php7吗,PHPStorm支持PHP7类型提示等新语法
  2. 高级运维工程师的打怪升级之路
  3. 在用户控件中操作父页面上的控件
  4. 创客常用开发板“四剑客”对比,谁最“快”?
  5. Android keymaster的介绍和总结
  6. ubuntu18.10安装octave
  7. Django ajax 检测用户名是否已被注册
  8. IntelliJ IDEA for Mac如何通过指定的关键字查找/搜索类文件
  9. idea输入法候选区不跟随光标
  10. Tomcat设置cmd窗口的title属性
  11. 看mysql版本信息_查看mysql 的版本信息
  12. [Win11]解决PS/2标准键盘带感叹号,笔记本键盘无法使用。代码19:由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个
  13. python编写翻译器_用Python做一个简单的翻译工具
  14. Rabbitmq二进制集群搭建
  15. C++学习记录7:定义教师类Teacher和干部类Cadre,采用多重继承的方式由这两个类派生出新类Teacher_Cadre(教师兼干部类)
  16. Android Verified Boot 2.0
  17. java 葫芦娃.rmvb,课内资源 - 基于JAVA的葫芦娃 — 最终之战
  18. 上元之夜,故宫亮起来!
  19. 在微信H5网页中获取用户基本信息
  20. Linux服务器移动文件命令

热门文章

  1. 计算机编程语言python-初学者最容易学的六种编程语言
  2. python利器怎么编程-Linux 利器- Python 脚本编程入门(一)
  3. 不懂编程可以自学python吗-我不会编程,也可能学会Python吗?
  4. python利器跟python一样吗-VS code for python开发利器
  5. python散点图拟合曲线-python曲线拟合
  6. python详细安装教程3.8.3-Python下载 v3.8.3 官方中文版
  7. 爬虫好学吗python-爬虫Python入门好学吗?学什么?
  8. python与php8-详解Python中Unicode和utf-8
  9. pythonurllib模块-python模块之urllib
  10. 学python用哪个软件-学python要准备什么软件-问答-阿里云开发者社区-阿里云