#include<stdio.h>
#include<string.h>
#define MOD 1000000007
long long fact(long long x)
{
long long f=1;
if(x==0)
return 1;
else
{
for(int i=1;i<=x;i++)
//f=f*(i%MOD); //mod was used in a wrong way
f=((f*i)%MOD); //always use it as shown here
}
return f%MOD;
}
long long square(long long x)
{
//return x*x; //mod was missing here
return (x*x)%MOD;
}
long long power(long long base,long long expo)
{
if(base==0)
return 0;
if(expo==0)
return 1;
else
{
if(expo%2==0)
return square(power(base,expo/2))%MOD;
else
return (base*power(base,expo-1))%MOD;
}
}
int main()
{
int arr[26]={0};
char ip[1000000];
long long num,den=1;
for(int i=0;i<len;i++)
arr[ip[i]-'a']++;
for(int i=0;i<26;i++)
arr[i]/=2;
num=fact(len/2);
for(int i=0;i<26;i++)
{
//den=den*(fact(arr[i])); //again mod was missing here
den=(den*(fact(arr[i])))%MOD;
}
den=den%MOD;
den=power(den,MOD-2);
printf("%lld\n",((num
%MOD
)*(den
%MOD
))%MOD
); //printf("%lld",fact((long long)5));
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RyaW5nLmg+CgojZGVmaW5lIE1PRCAxMDAwMDAwMDA3CmxvbmcgbG9uZyBmYWN0KGxvbmcgbG9uZyB4KQp7Cglsb25nIGxvbmcgZj0xOwoJaWYoeD09MCkKCQlyZXR1cm4gMTsKCWVsc2UKCXsKCQlmb3IoaW50IGk9MTtpPD14O2krKykKCQkJLy9mPWYqKGklTU9EKTsJCS8vbW9kIHdhcyB1c2VkIGluIGEgd3Jvbmcgd2F5IAoJCQlmPSgoZippKSVNT0QpOwkJLy9hbHdheXMgdXNlIGl0IGFzIHNob3duIGhlcmUgCgl9CglyZXR1cm4gZiVNT0Q7Cn0KbG9uZyBsb25nIHNxdWFyZShsb25nIGxvbmcgeCkKewoJLy9yZXR1cm4geCp4OwkJLy9tb2Qgd2FzIG1pc3NpbmcgaGVyZQoJcmV0dXJuICh4KngpJU1PRDsKfQpsb25nIGxvbmcgcG93ZXIobG9uZyBsb25nIGJhc2UsbG9uZyBsb25nIGV4cG8pCnsKCWlmKGJhc2U9PTApCgkJcmV0dXJuIDA7CglpZihleHBvPT0wKQoJCXJldHVybiAxOwoJZWxzZQoJewoJCWlmKGV4cG8lMj09MCkKCQkJcmV0dXJuIHNxdWFyZShwb3dlcihiYXNlLGV4cG8vMikpJU1PRDsKCQllbHNlCgkJCXJldHVybiAoYmFzZSpwb3dlcihiYXNlLGV4cG8tMSkpJU1PRDsKCX0KfQppbnQgbWFpbigpCnsKCWludCBhcnJbMjZdPXswfTsKCWNoYXIgaXBbMTAwMDAwMF07CglzY2FuZigiJXMiLGlwKTsKCWxvbmcgbG9uZyBudW0sZGVuPTE7CglpbnQgbGVuPXN0cmxlbihpcCk7Cglmb3IoaW50IGk9MDtpPGxlbjtpKyspCgkJYXJyW2lwW2ldLSdhJ10rKzsKCWZvcihpbnQgaT0wO2k8MjY7aSsrKQoJCWFycltpXS89MjsKCW51bT1mYWN0KGxlbi8yKTsKCQoJZm9yKGludCBpPTA7aTwyNjtpKyspCgl7CgkJLy9kZW49ZGVuKihmYWN0KGFycltpXSkpOwkJLy9hZ2FpbiBtb2Qgd2FzIG1pc3NpbmcgaGVyZQoJCWRlbj0oZGVuKihmYWN0KGFycltpXSkpKSVNT0Q7Cgl9CglkZW49ZGVuJU1PRDsKCWRlbj1wb3dlcihkZW4sTU9ELTIpOwoJcHJpbnRmKCIlbGxkXG4iLCgobnVtJU1PRCkqKGRlbiVNT0QpKSVNT0QpOwoJLy9wcmludGYoIiVsbGQiLGZhY3QoKGxvbmcgbG9uZyk1KSk7Cn0=