// 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 ) ) ; }
}
Ly8gQ2FsY3VsYXRlIE50aCBGaWJiaW9uYWNjaSBudW1iZXIgaW4gTyhsb2cgTikKb2JqZWN0IE1pbGt7CgkvLyBNYXRyaXggbXVsdGlwbGljYXRpb24KCWRlZiBtYXRtdWwobWF0MSA6IEFycmF5WyBBcnJheSBbSW50XSBdLCBtYXQyIDogQXJyYXlbIEFycmF5IFtJbnRdIF0pOiBBcnJheVsgQXJyYXkgW0ludF0gXSA9IHsKCQl2YWwgbiA9IG1hdDEuc2l6ZTsKCQl2YXIgcmVzID0gbmV3IEFycmF5WyBBcnJheSBbSW50XV0obiwgbik7CgkJZm9yKGkgPC0gMCB1bnRpbCBuKXsKCQkJZm9yKGogPC0gMCB1bnRpbCBuKXsKCQkJCXJlcyhpKShqKSA9IDA7CgkJCQlmb3IoayA8LSBrIHVudGlsIG4pewoJCQkJCXJlcyhpKShqKSArPSBtYXQxKGkpKGspICogbWF0MihrKShqKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gcmVzOwoJfQoJLy8gTWF0cml4IHBvd2VyaW5nCglkZWYgbWF0cG93KG1hdCA6IEFycmF5WyBBcnJheSBbSW50XSBdLCBwb3cgOiBJbnQpOiBBcnJheVsgQXJyYXkgW0ludF0gXSA9IHsKCQl2YWwgbiA9IG1hdC5zaXplOwoJCXZhciByZXMgPSBuZXcgQXJyYXlbIEFycmF5IFtJbnRdXShuLCBuKTsKCQlmb3IoaSA8LSAwIHVudGlsIG4pewoJCQlmb3IoaiA8LSAwIHVudGlsIG4pewoJCQkJaWYoaSA9PSBqKSByZXMoaSkoaikgPSAxOwoJCQkJZWxzZSByZXMoaSkoaikgPSAwOwoJCQl9CgkJfQoJCXdoaWxlKHBvdyA+IDApewoJCQlpZihwb3cgJSAyKXsKCQkJCXJlcyA9IG1hdG11bChyZXMsIG1hdCk7CgkJCX0KCQkJbWF0ID0gbWF0bXVsKG1hdCwgbWF0KTsKCQl9CgkJcmV0dXJuIHJlczsKCX0KCS8vIENhbGN1bGF0ZSBzdW0gb2YgYQoJZGVmIGZpYmIobiA6IEludCk6IEludCA9IHsKCQl2YXIgbWF0ID0gbmV3IEFycmF5WyBBcnJheSBbSW50XV0oMiwgMik7CgkJbWF0KDApKDApID0gMTsgbWF0KDApKDEpID0gMTsgbWF0KDEpKDApID0gMTsgbWF0KDEpKDEpID0gMDsKCQltYXQgPSBtYXRwb3cobWF0LCBuKTsKCQlyZXR1cm4gbWF0KDEpKDApOwoJfQoJLy8gTWFpbiBmdW5jdGlvbgoJZGVmIG1haW4oYXJncyA6IEFycmF5WyBTdHJpbmcgXSkgPSB7CgkJdmFsIG4gPSBhcmdzLnNpemU7CgkJZm9yKCBpIDwtIDAgdW50aWwgbikgYShpKSA9IHByaW50bG4oZmliYihhcmdzKGkpLnRvSW50KSk7Cgl9Cn0K
compilation info
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));
^
four errors found
stdout