33,027
社区成员




import java.math.BigInteger;
import java.util.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2008</p>
*
* <p>Company: </p>
*
* @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 < n ; i ++ ){
for(int j =0 ; j < n ; j ++ ){
sum = BigInteger.ZERO;
for(int k =0 ; k < n ; 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 < n ; i ++ ){
for( int j =0 ; j < n ; 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]);
}
}
}
#include <iostream.h>
long fib(long n,long k)
{
if(n <=k)
{
if((n <k-1)||(n>=0))
return 0;
else
if((n==k-1)||(n==k))
return 1;
}
else
return 2*fib(n-1,k)-fib(n-k-1,k);
}
if ( n < k - 1 || n >= 0) return 0;
/// <summary>
/// 非波纳切数列的意思是,后一项的值总是前面两项目之和,并且这个数据有两最初的项值均为1
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
int Fibonache(int i)
{
if (i<=2)
{
return 1;
}
return Fibonache(i - 1) + Fibonache(i - 2);
}