该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
k阶斐波那契数列的第k项的值。
常见的是2阶斐波那契数列。
例如: f[n]=f[n-1]+f[n-2]+f[n-3] 是三阶。
矩阵二分算法如下(JAVA代码,大数运算):
import java.math.BigInteger;
import java.util.*;
/**
*
Title:
*
*
Description:
*
*
Copyright: Copyright © 2008
*
*
Company:
*
* @author not attributable
* @version 1.0
*/
public class fib {
private static BigInteger a[][] , b[][] ;
/***
* 功能: 矩阵乘法,x = x*y;
* 输入: x, y 为矩阵,n是矩阵的维数:n*n。
* 时间复杂度: O(n^2)
* 空间复杂度: 0(n^2)
*/
private static void mul(BigInteger x[][], BigInteger y[][], int n)
{
BigInteger sum = new BigInteger("0");
BigInteger tmp[][] = new BigInteger[n][n];
for(int i =0 ;i
for(int j =0 ; j
sum = BigInteger.ZERO;
for(int k =0 ; k
sum = sum.add( x[i][k].multiply( y[k][j]) );
}
tmp[i][j] = sum;
}
}
a = tmp;
return ;
}
/***
* 功能: 初始化矩阵a
* 输入: n是矩阵的维数:n*n。
*/
private static void init(int n)
{
a= new BigInteger[n][n];
b = new BigInteger[n][n];
for(int i =0 ; i
for( int j =0 ; j
if(i == j+1 ){
a[i][j] = BigInteger.ONE;
}else{
a[i][j] = BigInteger.ZERO;
}
}
a[i][n-1] = BigInteger.ONE;
}
b = a ;
return ;
}
/***
* 功能: 计算n阶斐波那契序列第k项值;
* 输入: n , k 如上。
* 时间复杂度: O( log(k) * n^2 )
* 空间复杂度: 0( n^2 )
*/
private static void fib(int n , int k){
if(k == 1 ) return ;
fib(n,k/2);
mul(a,a,n);
if(1 == k%2 ){
mul(a,b,n);
}
return;
}
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
while(true){
int n = cin.nextInt(),k = cin.nextInt();
init(n);
fib(n,k);
System.out.println(a[0][n-1]);
}
}
}