fun readStr () = let fun scan reader stream = SOME (StringCvt.splitl (not o Char.isSpace) reader (StringCvt.skipWS reader stream)) in valOf (TextIO.scanStream scan TextIO.stdIn) end fun fact 0 = 1 | fact 1 = 1 | fact n = n * fact (n - 1) val () = let val s = readStr () val table = List.foldl (fn (ch, array) => let val index = Char.ord ch - Char.ord #"A" val oldValue = Array.sub (array, index) val newValue = oldValue + 1 in ( Array.update (array, index, newValue); array ) end) (Array.array (26, 0)) (String.explode s) val ans = (Array.foldl (fn (n, acc) => acc div (fact n)) (fact (String.size s)) table) - 1 in print (Int.toString ans ^ "\n") end