算法提高 递推求值
时间限制:1.0s 内存限制:256.0MB
问题描述
已知递推公式:
F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5,
F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3.
初始值为:F(1, 1)=2, F(1, 2)=3, F(2, 1)=1, F(2, 2)=4, F(3, 1)=6, F(3, 2)=5。
输入n,输出F(n, 1)和F(n, 2),由于答案可能很大,你只需要输出答案除以99999999的余数。
输入格式
输入第一行包含一个整数n。
输出格式
输出两行,第一行为F(n, 1)除以99999999的余数,第二行为F(n, 2)除以99999999的余数。
样例输入
4
样例输出
14
21
数据规模和约定
1<=n<=10^18。
package com.sihai.improve;
import java.util.Scanner;
public class sihai{
public final static long[][] UNIT = {{0,1,1,0,0,0,0,0},
{1,0,0,1,0,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,0,1,0,0},
{2,3,0,0,0,0,0,0},
{0,2,0,0,0,0,0,0},
{0,1,0,0,0,0,1,0},
{1,0,0,0,0,0,0,1}};
public final static long[][] ZERO = new long[8][8];
public final static long p = 99999999L;
public long[][] getNofMatrix(long n) {
if(n == 0)
return ZERO;
if(n == 1)
return UNIT;
if((n & 1) == 0) {
long[][] matrix = getNofMatrix( n >> 1);
return multiOfMatrix(matrix, matrix);
}
long[][] matrix = getNofMatrix((n - 1) >> 1);
return multiOfMatrix(multiOfMatrix(matrix, matrix), UNIT);
}
public long[][] multiOfMatrix(long[][] A, long[][] B) {
long result[][] = new long[A.length][B[0].length];
for(int i = 0;i < A.length;i++) {
for(int j = 0;j < B[0].length;j++) {
for(int k = 0;k < A[0].length;k++)
result[i][j] = (result[i][j] + A[i][k] * B[k][j]) % p;
}
}
return result;
}
public void printResult(long n) {
long[][] start = {{6,5,1,4,2,3,3,5}};
if(n == 1) {
System.out.println(start[0][4]+"\n"+start[0][5]);
return;
} else if(n == 2) {
System.out.println(start[0][2]+"\n"+start[0][3]);
return;
} else if(n == 3) {
System.out.println(start[0][0]+"\n"+start[0][1]);
return;
}
long[][] A = getNofMatrix(n - 3);
start = multiOfMatrix(start, A);
System.out.println(start[0][0]+"\n"+start[0][1]);
return;
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
long n = in.nextLong();
test.printResult(n);
}
}
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
相关推荐
编写一个程序求满足下列条件的最大n前n项和小于1000
本程序师c下的一个用递推的方法求n!算法实现
HEC-RAS适用于河道稳定和非稳定流一维水力计算,其功能强大,可进行各种涉水建筑物(如桥梁、涵洞、防洪堤、堰、水库、块状阻水建筑物等)的水面线分析计算,同时可生成横断面形态图、流量及水位过程曲线、复式河道三维...
设计洪水过程线的推求 设计洪水过程线的推求是水文hydrology和水资源工程中的一项重要任务,旨在计算和预测洪水过程线,以便更好地防洪和水资源管理。该过程涉及到洪水过程线的设计、计算和预测,需要结合洪水 ...
文章详细介绍了如何通过递推求法计算特定类型图的完美匹配数目,这是解决困难问题的一种有效途径。完美匹配的计数问题通常是非常复杂的,文章中的方法适合于解决那些结构重复的图类。尽管完美匹配计数问题是NP难问题...
复式河道水面线推求程序是水利水电工程领域中一项重要的计算任务,它涉及到河流动力学、水文学以及流体力学等多个方面的知识。在给定的压缩包“复式河道水面线推求程序,开发平台Fortran.zip”中,我们可以预见到包含...
在计算机科学和数据分析领域,"主元素"(Majority Element)是一个重要的概念,尤其是在数据处理和算法设计中。主元素是指在给定的一组数字中出现次数超过数组长度一半的元素。如果存在这样的元素,那么它就是数组的...
三、年最大值法和频率分布模型在暴雨强度公式推求中的应用 年最大值法是一种常用的降雨数据采样方法,本文通过对佳县 21 年的降雨资料的分析,采用年最大值法取样方法,获取了大量的降雨数据。频率分布模型是对降雨...
标题“明渠均匀流水面线推求”涉及的是水利学中的一个重要概念,即在明渠中,水流在一定条件下能够保持稳定流动的状态,这种流动被称为均匀流。在均匀流中,水流的各项参数如流速、水深、断面平均流速等在水平方向上...
"smx"可能是特定软件的缩写,用于水面线的计算和推求。本篇文章将深入探讨水面线推求的原理、方法以及可能涉及的SMX工具。 水面线的推求通常是基于水动力学和水文学的理论,通过模拟水流运动来确定在不同水位条件下...
本教程主要探讨如何利用流量资料推求设计洪水,特别是在大流域的背景下。设计洪水是指为了解决水利工程中的防洪问题,根据特定设计标准所确定的洪水事件,它包括了对水库自身安全和下游防护区安全的需求。 首先,...
《由暴雨资料推求设计洪水》这一PPT课件,深入讲解了利用暴雨资料推求设计洪水的关键步骤和计算方法,为水利工程的设计和洪水风险评估提供了科学的理论基础和实用的技术手段。 首先,课件明确了设计洪水推求的核心...
理查德森外推通过结合不同分辨率的计算结果来获得更精确的估计值,从而减少由于离散化带来的误差。 在C++编程环境中,我们可以构建算法来实现理查德森外推求导数。C++是一种强大的、面向对象的编程语言,适合处理...
【由暴雨资料推求设计洪水】是水文学和水利工程领域中的一个重要课题,主要涉及在缺乏足够流量观测数据或洪水系列不一致的情况下,如何利用降雨数据来估算极端洪水事件的发生概率和规模。本讲座主要分为三个部分:...
【由雨量资料推求设计洪水】是一种在水文学和水利工程中常见的技术,主要用于在缺乏直接的流域流量数据或者洪水序列一致性受人类活动影响时,预测可能出现的设计洪水情况。这一方法主要分为三个步骤: 1. **推求...
本文将结合《如何由流量资料推求设计洪水大流域PPT课件.pptx》这一专业资料,详细探讨设计洪水的概念、组成、计算方法以及如何科学推求设计洪水大流域。 洪水设计的根本目的在于评估洪水发生的可能性,并基于此评估...
- **直接法**:当流域内有足够的雨量站点时,可以直接使用统计选样、插补展延、特大值处理和面雨量频率计算来推求设计面暴雨量。 - **间接法**:若站点稀少,可以先计算代表站的设计点暴雨,然后通过暴雨点面关系...
伽马函数推求水文单位线 伽马函数推求水文单位线 伽马函数推求水文单位线 伽马函数推求水文单位线