## Problem Definition

You are asked to calculate factorials of some small positive integers.

### Input

An integer t, 1<=t<=100, denoting the number of testcases, followed by t lines, each containing a single integer n, 1<=n<=100.

### Output

For each integer n given at input, display a line with the value of n!

More details about the problem is available here.## Solution

open System | |

open System.Numerics | |

let init() = Array.init 158 (fun x -> if x = 0 then 1 else 0) | |

let minLength (a:int array) : int = | |

let rec m' (a:int array) i = | |

match a.[i-1] with | |

| 0 -> m' a (i-1) | |

| _ -> i | |

in | |

m' a a.Length | |

let toString' (a:int array) = | |

let s = System.Text.StringBuilder() | |

let mLength = minLength a | |

for i=(mLength-1) downto 0 do | |

s.Append(a.[i])|>ignore | |

s.ToString() | |

let (^*) multiplier (multiplicand:int array)= | |

let rec multiplyOPT (a:int array) b i acc length= | |

let l = Math.Min(length,a.Length) | |

if i< l then | |

let r = a.[i] * b + acc | |

a.[i] <- r%10 | |

multiplyOPT a b (i+1) (r/10) length | |

else | |

a | |

in | |

multiplyOPT multiplicand multiplier 0 0 (multiplicand |>minLength |> (+) 2) | |

let factorial n = | |

let rec fac n r = | |

match n with | |

| 0 -> toString' r | |

| _ -> fac (n-1) (n^*r) | |

fac n (init()) | |

let intFactorial (i : uint64) = | |

let rec f (i:uint64) (acc:uint64) = | |

match i with | |

| 0UL -> acc | |

| i -> f (i-1UL) (acc*i) | |

in | |

f i 1UL | |

let computeFactorial (n:int) = | |

if n > 20 then | |

factorial n | |

else | |

(intFactorial (n |> uint64)).ToString(); | |

let solveSpoj24() = | |

let rec solveLines currentLine maxLines = | |

if currentLine < maxLines then | |

System.Console.ReadLine() | |

|> int | |

|> computeFactorial | |

|> printfn "%s" | |

solveLines (currentLine+1) maxLines | |

in | |

match Console.ReadLine() |> Int32.TryParse with | |

| (true, i) when i > 0 -> solveLines 0 i | |

| _ -> () | |

solveSpoj24() |