Problem:
Score : 200 points

Problem Statement

You are given a string S of length N.
Among its subsequences, count the ones such that all characters are different, modulo 10^9+7. Two subsequences are considered different if their characters come from different positions in the string, even if they are the same as strings.

Here, a subsequence of a string is a concatenation of one or more characters from the string without changing the order.

Constraints

1 \leq N \leq 100000

S consists of lowercase English letters.

|S|=N

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the number of the subsequences such that all characters are different, modulo 10^9+7.

Sample Input 1

4
abcd

Sample Output 1

15

Since all characters in S itself are different, all its subsequences satisfy the condition.

Sample Input 2

3
baa

Sample Output 2

5

The answer is five: b, two occurrences of a, two occurrences of ba. Note that we do not count baa, since it contains two as.

Sample Input 3

5
abcab

Sample Output 3

17

Solution in Scala (2.11.7) (judge verdict: Runtime Error)

import scala.io.{StdIn => in}

object Main extends App {

  val mod = 1000000007L
  def modInve(a:Long,b:Long,m:Long):Long = {
    if(b == 0) 1
    else if(b % 2 == 0) modInve(a * a%m, b/2, m)
    else a * modInve(a, b-1,m) % m
  }

  val n = in.readInt
  val s = in.readLine
  val sa = s.toSet.toArray
  val same = s.size - sa.size + 1
  val n2 = sa.size

  val fact = Array.ofDim[Long](n+2)
  fact(0) = 1
  fact(1) = 1
  for(i <- 2 until n+2) {
    fact(i) = fact(i-1) * i % mod
  }

  // debug(same)
  // debug(fact.mkString(" "))

  val ans =
    if(same == 0) {
      s.indices.map(i => (fact(n) * modInve(fact(i+1) * fact(n-(i+1)) % mod, mod-2, mod)))
      .reduce((a,b) => (a+b) % mod)
    }
    else {
      sa.indices.drop(1).map(i => (fact(n2) * modInve(fact(i+1) * fact(n2-(i+1)) % mod,mod-2,mod)) * same % mod)
        .reduce((a,b) => (a+b) % mod) + n
      // debug(res.mkString(" "))
      // res.reduce((a,b) => (a+b) % mod) + n
      // debug(test.mkString(" "))
      // res
    }

  // debug(ans)
  println(ans)

  def debug(any:Any*):Unit = {
    if(this.getClass.toString == "class Main$") return
    println(any.mkString(" "))
  }
}