public class Matrix
{
  private long mat[][];

  public Matrix(long m00, long m01, long m10, long m11)
  {
    this.mat = new long[2][2];
    this.mat[0][0] = m00;
    this.mat[0][1] = m01;
    this.mat[1][0] = m10;
    this.mat[1][1] = m11;
  }

  public Matrix()
  {
    this(1, 0, 0, 1);
  }

  public long getElement(int row, int col)
  {
    return this.mat[row][col];
  }

  public Matrix times(Matrix rhs)
  {
    long m00, m01, m10, m11;
    m00 = this.mat[0][0] * rhs.mat[0][0] + this.mat[0][1] * rhs.mat[1][0];
    m01 = this.mat[0][0] * rhs.mat[0][1] + this.mat[0][1] * rhs.mat[1][1];
    m10 = this.mat[1][0] * rhs.mat[0][0] + this.mat[1][1] * rhs.mat[1][0];
    m11 = this.mat[1][0] * rhs.mat[0][1] + this.mat[1][1] * rhs.mat[1][1];
    return new Matrix(m00, m01, m10, m11);
  }

  public String toString()
  {
    String retval = String.format("|%3d %3d|\n", this.mat[0][0], this.mat[0][1]);
    retval += String.format("|%3d %3d|\n", this.mat[1][0], this.mat[1][1]);
    return retval;
  }

  public static void main(String args[])
  {
    Matrix m1 = new Matrix();
    Matrix m2 = new Matrix(1, 1, 1, 0);
    for(int i = 0; i < 10; i++)
    {
      m1 = m1.times(m2);
      System.out.println(m1);
    }
  }
}
