//codeforces 520c
//思路:两个字符串,第一个字符串不动,移动第二个的时候,你会发现第二个串的每个字符都会和第一个串的某个字符对一次,所以在构造的时候当然选择出现次数最多的那个
//如果假设次数出现最多的字符有k种,第一个字符有k种选择,第二个有k种选择....第n个字符有k种选择,
//rk(k,n);
#include<iostream>
using namespace std;
#define M 1000000007;
int n;
char a[100010];
int c[5];
//二分快速求幂
long long rk(int n, int k)
{
long long res = 1;
while(k) {
if(k & 1)
res *= n, res %= M;
n *= n;
n %= M;
k >>= 1;
}
return res;
}
int main()
{
int i;
cin>>n>>a;
//遍历字符串,统计每个字符出现的次数
for(i = 1; i <= n; ++i)
{
if(a[i]==‘A‘)
c[1]++;
else if(a[i]==‘G‘)
c[2]++;
else if(a[i]==‘C‘)
c[3]++;
else
c[4]++;
}
//找出出现最多次的那个字符出现的次数
int Max = max(max(c[1], c[2]), max(c[3], c[4]));
int m=0;
//得到出现最多次字符的种类
for(i = 1; i <= 4; ++i)
if(Max == c[i])
m++;
cout<<rk(m, n)<<endl;
}