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++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <map>
#include <stdio.h>
using namespace std;

//typedefリスト
typedef vector<int> vint;
typedef vector<string> vstr;

int main(void) {
	long long int N, num,n, nCr,Call,Cfront,Cback;
	Call=0;
	Cfront = 0;
	Cback = 0;
	nCr = 0;
	num = 1;
	n = 1;
	string S;
	cin >> N >> S;

	for (int i = 1; i <= N; i++) {
		num = 1;
		n = 1;
		for (int j = 0; j < i; j++) {
			num = num * (N - j);
		}
		for (int j = 1; j <= i; j++) {
			n = n * j;
		}
		nCr += num / n;
	}
	Call=nCr;
	
	for (int i = 0; i < N; i++) {
		for (int j = i + 1; j < N; j++) {
			nCr = 0;
			Cfront=0;
			Cback=0;
			if (S[i] == S[j]) {
				for (int k = 1; k <= j-i; k++) {
					num = 1;
					n = 1;
					for (int l = 0; l < k; l++) {
						num = num * (j-i - l);
					}
					for (int l = 1; l <= k; l++) {
						n = n * l;
					}
					nCr += num / n;
				}
				for (int k = 1; k <= i; k++) {
					num = 1;
					n = 1;
					for (int l = 0; l < k; l++) {
						num = num * (i - l);
					}
					for (int l = 1; l <= k; l++) {
						n = n * l;
					}
					Cfront += num / n;
				}
				for (int k = 1; k <= N-j-2; k++) {
					num = 1;
					n = 1;
					for (int l = 0; l < k; l++) {
						num = num * (N-j-2 - l);
					}
					for (int l = 1; l <= k; l++) {
						n = n * l;
					}
					Cback += num / n;
				}
			if(Cback==0)Cback=-1;
				if(Cfront==0)Cfront=-1;
				Call -= nCr * ((Cback+1) + (Cfront+1));
			}
		}
	}

	cout << Call%1000000007 << endl;
}