// Calculate Nth Fibbionacci number in O(log N)
// Matrix multiplication
def matmul
( mat1
: Array
[ Array
[ Int
] ] , mat2
: Array
[ Array
[ Int
] ] ) : Array
[ Array
[ Int
] ] = { var res
= new Array
[ Array
[ Int
] ] ( n, n
) ; res( i) ( j) = 0 ;
res( i) ( j) += mat1( i) ( k) * mat2( k) ( j) ;
}
}
}
}
// Matrix powering
def matpow
( mat
: Array
[ Array
[ Int
] ] , pow
: Int
) : Array
[ Array
[ Int
] ] = { var res
= new Array
[ Array
[ Int
] ] ( n, n
) ; if ( i
== j
) res
( i
) ( j
) = 1 ; }
}
res = matmul( res, mat) ;
}
mat = matmul( mat, mat) ;
}
}
// Calculate sum of a
def fibb
( n
: Int
) : Int
= { var mat
= new Array
[ Array
[ Int
] ] ( 2 ,
2 ) ; mat( 0 ) ( 0 ) = 1 ; mat( 0 ) ( 1 ) = 1 ; mat( 1 ) ( 0 ) = 1 ; mat( 1 ) ( 1 ) = 0 ;
mat = matpow( mat, n) ;
}
// Main function
def main
( args
: Array
[ String
] ) = { for ( i
< -
0 until n
) a
( i
) = println
( fibb
( args
( i
) .
toInt ) ) ; }
}
Ly8gQ2FsY3VsYXRlIE50aCBGaWJiaW9uYWNjaSBudW1iZXIgaW4gTyhsb2cgTikKb2JqZWN0IE1pbGt7CgkvLyBNYXRyaXggbXVsdGlwbGljYXRpb24KCWRlZiBtYXRtdWwobWF0MSA6IEFycmF5WyBBcnJheSBbSW50XSBdLCBtYXQyIDogQXJyYXlbIEFycmF5IFtJbnRdIF0pOiBBcnJheVsgQXJyYXkgW0ludF0gXSA9IHsKCQl2YWwgbiA9IG1hdC5zaXplOwoJCXZhciByZXMgPSBuZXcgQXJyYXlbIEFycmF5IFtJbnRdXShuLCBuKTsKCQlmb3IoaSA8LSAwIHVudGlsIG4pewoJCQlmb3IoaiA8LSAwIHVudGlsIG4pewoJCQkJcmVzKGkpKGopID0gMDsKCQkJCWZvcihrIDwtIGsgdW50aWwgbil7CgkJCQkJcmVzKGkpKGopICs9IG1hdDEoaSkoaykgKiBtYXQyKGspKGopOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiByZXM7Cgl9CgkvLyBNYXRyaXggcG93ZXJpbmcKCWRlZiBtYXRwb3cobWF0IDogQXJyYXlbIEFycmF5IFtJbnRdIF0sIHBvdyA6IEludCk6IEFycmF5WyBBcnJheSBbSW50XSBdID0gewoJCXZhbCBuID0gbWF0LnNpemU7CgkJdmFyIHJlcyA9IG5ldyBBcnJheVsgQXJyYXkgW0ludF1dKG4sIG4pOwoJCWZvcihpIDwtIDAgdW50aWwgbil7CgkJCWZvcihqIDwtIDAgdW50aWwgbil7CgkJCQlpZihpID09IGopIHJlcyhpKShqKSA9IDE7CgkJCQllbHNlIHJlcyhpKShqKSA9IDA7CgkJCX0KCQl9CgkJd2hpbGUocG93ID4gMCl7CgkJCWlmKHBvdyAlIDIpewoJCQkJcmVzID0gbWF0bXVsKHJlcywgbWF0KTsKCQkJfQoJCQltYXQgPSBtYXRtdWwobWF0LCBtYXQpOwoJCX0KCQlyZXR1cm4gcmVzOwoJfQoJLy8gQ2FsY3VsYXRlIHN1bSBvZiBhCglkZWYgZmliYihuIDogSW50KTogSW50ID0gewoJCXZhciBtYXQgPSBuZXcgQXJyYXlbIEFycmF5IFtJbnRdXSgyLCAyKTsKCQltYXQoMCkoMCkgPSAxOyBtYXQoMCkoMSkgPSAxOyBtYXQoMSkoMCkgPSAxOyBtYXQoMSkoMSkgPSAwOwoJCW1hdCA9IG1hdHBvdyhtYXQsIG4pOwoJCXJldHVybiBtYXQoMSkoMCk7Cgl9CgkvLyBNYWluIGZ1bmN0aW9uCglkZWYgbWFpbihhcmdzIDogQXJyYXlbIFN0cmluZyBdKSA9IHsKCQl2YWwgbiA9IGFyZ3Muc2l6ZTsKCQlmb3IoIGkgPC0gMCB1bnRpbCBuKSBhKGkpID0gcHJpbnRsbihmaWJiKGFyZ3MoaSkudG9JbnQpKTsKCX0KfQo=
compilation info
Main.scala:5: error: not found: value mat
val n = mat.size;
^
Main.scala:10: error: not found: value k
for(k <- k until n){
^
Main.scala:28: error: type mismatch;
found : Int
required: Boolean
if(pow % 2){
^
Main.scala:31: error: reassignment to val
mat = matmul(mat, mat);
^
Main.scala:45: error: not found: value a
for( i <- 0 until n) a(i) = println(fibb(args(i).toInt));
^
5 errors found
stdout