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 C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{

	static void Main(string[] args)
	{
		// スペース区切りの整数の入力
		var N = int.Parse(Console.ReadLine());
		var S = Console.ReadLine();

		var answer = 0;
		for(int num =1; num <= N; num++)
		{
			var combinations = Combination.Enumerate(S.ToArray(), num, withRepetition: false);
			//var result = combinations.Select(x => new String(x)).ToList().Distinct();
			var result = combinations.Where(x => x.All(y => x.Count(z => z == y) == 1)).ToList();
			answer += result.Count();
		}
		Console.WriteLine(answer);

	}

	public static class Combination
	{
		public static IEnumerable<T[]> Enumerate<T>(IEnumerable<T> items, int k, bool withRepetition)
		{
			if (k == 1)
			{
				foreach (var item in items)
					yield return new T[] { item };
				yield break;
			}
			foreach (var item in items)
			{
				var leftside = new T[] { item };

				// item よりも前のものを除く （順列と組み合わせの違い)
				// 重複を許さないので、unusedから item そのものも取り除く
				var unused = withRepetition ? items : items.SkipWhile(e => !e.Equals(item)).Skip(1).ToList();

				foreach (var rightside in Enumerate(unused, k - 1, withRepetition))
				{
					yield return leftside.Concat(rightside).ToArray();
				}
			}
		}
	}

}