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("The Fibonacci number for "+input+" is "+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));
}
}
}
0 comments: