# _*_ coding:utf-8 _*_

#  Atcoder_Grand_Contest031-A

#  TODO https://atcoder.jp/contests/agc031/tasks/agc031_a

from collections import Counter



def solveProblem(S):

	# Sはサンプル3の[abcab]を取って説明

	SSorted = sorted(S)

	# SSorted = aabbc

	stringCounterBox = Counter(SSorted)

	# [(a,2),(b,2),(c,1)]

	maxStrLength = len(stringCounterBox)

	# 文字そのものを並べる文字列長さは 1から3まで

	# print("maxStringLength:{}".format(maxStrLength))

	countList = list(stringCounterBox.values())

	# [2,2,1] と 各文字数だけ取り出した配列になった

	# print("countList:{}".format(countList))

	'''

	戦略

	1個の時→1個の配列を取り出した物を足す→2 + 2 + 1 = 5

	2個の時→取り出す文字は文字毎に数字だけパターンが替わる→ 2*2 + 2*1 + 2* 1 = 8

	3個の時 同上→ 2*2*1 = 4

	これ以上の取り出しはもう出来ない:同じ文字が出てくるため

	5 + 8 + 4 = 17 と答えと一致した

	TODO 取り出す配列番号を調べる方法が不明

	この場合なら2個の時0番目と1番目,0番目と2番目,1番目と2番目を洗い出すのはどうするのか？

	偉い人の回答待ち

	'''

	counter = 1

	for i in range(0,len(countList),+1):



		# counter = (counter * (countList[i]+1)) % (10^9+7)

		counter = (counter*(countList[i]+1)) % (pow(10,9)+7)



	answer = counter-1

	return answer





if __name__ == '__main__':

	_ = int(input().strip())

	S = str(input().strip())

	solution = solveProblem(S)

	print(("{}".format(solution)))

# _*_ coding:utf-8 _*_

#  Atcoder_Grand_Contest031-A

#  TODO https://atcoder.jp/contests/agc031/tasks/agc031_a

from collections import Counter



def solveProblem(S):

	# Sはサンプル3の[abcab]を取って説明

	# SSorted = sorted(S)

	# SSorted = aabbc

	# Counterクラスを使うと整列もしれくれるのでソートは不要と判断

	stringCounterBox = Counter(S)

	# [(a,2),(b,2),(c,1)]

	maxStrLength = len(stringCounterBox)

	# 文字そのものを並べる文字列長さは 1から3まで

	countList = list(stringCounterBox.values())

	# [2,2,1] と 各文字数だけ取り出した配列になった

	'''

	戦略

	リストに入った数値に1足した物を掛けて行く。最後に1を引いたのが答え。

	根拠

	このabcの時を例に出すとa,b,cの3字について

	a→0回～2回出す

	b→aと同じ

	c→0回～1回出す

	ケースの組み合わせを考えると 3 * 3 * 2 = 18通りある

	しかし 全ての文字0回という選択をすると文字列そのものが無くなってしまう。

	この場合は対象外となるので1減らす。

	'''

	counter = 1

	for i in range(0,len(countList),+1):



		# counter = (counter * (countList[i]+1)) % (10^9+7)

		counter = (counter*(countList[i]+1)) % (pow(10,9)+7)



	answer = counter-1

	return answer





if __name__ == '__main__':

	_ = int(input().strip())

	S = str(input().strip())

	solution = solveProblem(S)

	print(("{}".format(solution)))

# _*_ coding:utf-8 _*_
#  Atcoder_Grand_Contest031-A
#  TODO https://atcoder.jp/contests/agc031/tasks/agc031_a
from collections import Counter


def solveProblem(S):
    # Sはサンプル3の[abcab]を取って説明
    SSorted = sorted(S)
    # SSorted = aabbc
    stringCounterBox = Counter(SSorted)
    # [(a,2),(b,2),(c,1)]
    maxStrLength = len(stringCounterBox)
    # 文字そのものを並べる文字列長さは 1から3まで
    # print("maxStringLength:{}".format(maxStrLength))
    countList = list(stringCounterBox.values())
    # [2,2,1] と 各文字数だけ取り出した配列になった
    # print("countList:{}".format(countList))
    """
	戦略
	1個の時→1個の配列を取り出した物を足す→2 + 2 + 1 = 5
	2個の時→取り出す文字は文字毎に数字だけパターンが替わる→ 2*2 + 2*1 + 2* 1 = 8
	3個の時 同上→ 2*2*1 = 4
	これ以上の取り出しはもう出来ない:同じ文字が出てくるため
	5 + 8 + 4 = 17 と答えと一致した
	TODO 取り出す配列番号を調べる方法が不明
	この場合なら2個の時0番目と1番目,0番目と2番目,1番目と2番目を洗い出すのはどうするのか？
	偉い人の回答待ち
	"""
    counter = 1
    for i in range(0, len(countList), +1):
        # counter = (counter * (countList[i]+1)) % (10^9+7)
        counter = (counter * (countList[i] + 1)) % (pow(10, 9) + 7)
    answer = counter - 1
    return answer


if __name__ == "__main__":
    _ = int(input().strip())
    S = str(input().strip())
    solution = solveProblem(S)
    print(("{}".format(solution)))

# _*_ coding:utf-8 _*_
#  Atcoder_Grand_Contest031-A
#  TODO https://atcoder.jp/contests/agc031/tasks/agc031_a
from collections import Counter


def solveProblem(S):
    # Sはサンプル3の[abcab]を取って説明
    # SSorted = sorted(S)
    # SSorted = aabbc
    # Counterクラスを使うと整列もしれくれるのでソートは不要と判断
    stringCounterBox = Counter(S)
    # [(a,2),(b,2),(c,1)]
    maxStrLength = len(stringCounterBox)
    # 文字そのものを並べる文字列長さは 1から3まで
    countList = list(stringCounterBox.values())
    # [2,2,1] と 各文字数だけ取り出した配列になった
    """
	戦略
	リストに入った数値に1足した物を掛けて行く。最後に1を引いたのが答え。
	根拠
	このabcの時を例に出すとa,b,cの3字について
	a→0回～2回出す
	b→aと同じ
	c→0回～1回出す
	ケースの組み合わせを考えると 3 * 3 * 2 = 18通りある
	しかし 全ての文字0回という選択をすると文字列そのものが無くなってしまう。
	この場合は対象外となるので1減らす。
	"""
    counter = 1
    for i in range(0, len(countList), +1):
        # counter = (counter * (countList[i]+1)) % (10^9+7)
        counter = (counter * (countList[i] + 1)) % (pow(10, 9) + 7)
    answer = counter - 1
    return answer


if __name__ == "__main__":
    _ = int(input().strip())
    S = str(input().strip())
    solution = solveProblem(S)
    print(("{}".format(solution)))

-    SSorted = sorted(S) +    # SSorted = sorted(S) -    stringCounterBox = Counter(SSorted) +    # Counterクラスを使うと整列もしれくれるのでソートは不要と判断 +    stringCounterBox = Counter(S) -    # print("maxStringLength:{}".format(maxStrLength)) -    # print("countList:{}".format(countList)) -	1個の時→1個の配列を取り出した物を足す→2 + 2 + 1 = 5 -	2個の時→取り出す文字は文字毎に数字だけパターンが替わる→ 2*2 + 2*1 + 2* 1 = 8 -	3個の時 同上→ 2*2*1 = 4 -	これ以上の取り出しはもう出来ない:同じ文字が出てくるため -	5 + 8 + 4 = 17 と答えと一致した -	TODO 取り出す配列番号を調べる方法が不明 -	この場合なら2個の時0番目と1番目,0番目と2番目,1番目と2番目を洗い出すのはどうするのか？ -	偉い人の回答待ち +	リストに入った数値に1足した物を掛けて行く。最後に1を引いたのが答え。 +	根拠 +	このabcの時を例に出すとa,b,cの3字について +	a→0回～2回出す +	b→aと同じ +	c→0回～1回出す +	ケースの組み合わせを考えると 3 * 3 * 2 = 18通りある +	しかし 全ての文字0回という選択をすると文字列そのものが無くなってしまう。 +	この場合は対象外となるので1減らす。