/* The Great Win32 Language Shootout http://dada.perl.it/shootout/ 
   contributed by Isaac Gouy (Nice novice)

   Transliterated from the Java implementation

To compile:	
   nicec --sourcepath=.. -d=. -a matrix.jar matrix

To run:
   java -jar matrix.jar 300
*/


// NOTE: the type of a variable declared with let
//       or var will be inferred by the compiler


import ackermann; // reuse toSingleInt


void main(String[] args){
   var n =  toSingleInt(args);
   let int SIZE = 30;

   let m1 = mkmatrix(SIZE, SIZE);
   let m2 = mkmatrix(SIZE, SIZE);
   let mm = new int[SIZE][SIZE];

   while (n-- > 0) mmult(m1, m2, mm);

   print(mm[0][0]); print(" ");
   print(mm[2][3]); print(" ");      
   print(mm[3][2]); print(" ");
   println(mm[4][4]);
}


int[][] mkmatrix(int nRows, int nCols) {
   int count = 1;
   let m = new int[nRows][nCols];
   for (var i = 0; i < nRows; i++) 
      for (var j = 0; j < nCols; j++) 
         m[i][j] = count++;
   return m;
}


void mmult(int[][] m1, int[][] m2, int[][] m) {
   let nRows = m1.length;
   let nCols = nRows; // Assume a square matrix
   for (var i=0; i < nRows; i++) 
      for (var j = 0; j < nCols; j++) {
         int val = 0;
         for (var k = 0; k < nCols; k++) 
            val += m1[i][k] * m2[k][j];
         m[i][j] = val;
      }
}