Monday, 24 February 2014

UVA Problem ID 10579 (Fibonacci Numbers)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;


public class Main {
 public static void main (String args[]) throws IOException
 {
  BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  String input;
  StringBuilder sb=new StringBuilder(10000);
  
  while((input=br.readLine())!=null)
  {
   BigInteger A[][]={{new BigInteger("1"),new BigInteger("1")},{new BigInteger("1"),new BigInteger("0")}};
   
   sb.append(matrixpower(A,Integer.parseInt(input))[1][0]+"\n");
  }
  System.out.print(sb);
 }
 public static BigInteger[][] matrixmultiplication(BigInteger[][] A,BigInteger[][] B)
 {
  BigInteger resultantmatrix[][]=new BigInteger[2][2];
  resultantmatrix[0][0] =  A[0][0].multiply(B[0][0]).add(A[0][1].multiply(B[1][0]));
  resultantmatrix[0][1] =  A[0][0].multiply(B[0][1]).add(A[0][1].multiply(B[1][1]));
  resultantmatrix[1][0] =  A[1][0].multiply(B[0][0]).add(A[1][1].multiply(B[1][0]));
  resultantmatrix[1][1] =  A[1][0].multiply(B[0][1]).add(A[1][1].multiply(B[1][1]));
  
  return resultantmatrix;
 }
 public static BigInteger[][] matrixpower(BigInteger[][] A,int power)
 {
  if(power==0)
  {
   BigInteger matrixA[][]={{new BigInteger("1"),new BigInteger("0")},{new BigInteger("0"),new BigInteger("1")}};
   return matrixA;
  }
  
  else if(power % 2==0)
  {
   BigInteger C[][]=matrixpower(A, power/2);
   return matrixmultiplication(C,C);
  }
  else
  {
   return matrixmultiplication(A,matrixpower(A, power-1));
  }
 }
}

Previous Post
Next Post

0 comments:

Advertisement