import Integral.Implicits._
object Main {
def half[T:Integral](a:T) : T = a / 2.asInstanceOf[T]
def odd[T:Integral](a:T) : Boolean = a % 2.asInstanceOf[T] == 1.asInstanceOf[T]
def mult_acc11[T:Integral](n:T, a:T, r:T = 0) : T = (odd(n), n) match {
case (true, 1) => r + a
case (true, _) => mult_acc11(half(n), a + a, r + a)
case (_,_) => mult_acc11(half(n), a + a, r)
}
def main(args: Array[String]): Unit = {
def f(n: Int) = (BigInt(1) to BigInt(n)).product
println(mult_acc11(7,5))
}
}