#include #include #include #include #include #include #include #include #include #include #include #include // needed for accumulate #include // needed for std:: move #include #include #include #include #include #include #include #include #include #include #pragma warning(disable:4996) // ignore this #define ve vector #define pb push_back #define mp make_pair #define srt(x) sort(x.begin(),x.end()) #define mod static_cast (1e9+7) #define sumx(x) accumulate(x.begin(),x.end(),0LL) #define all(x) x.begin(),x.end() #define int2 int64_t #define pi 3.14159265358979323846 #define testing 0 #define code_chef 1 #define code_jam 0 #define getcx getchar #define rep(i,a,b) for(long long i=a;i T max(T A) { return A; } template T max(T A, T B, args... S) { return max(A > B ? A : B, S...); } template T min(T A) { return A; } template T min(T A, T B, args... S) { return min(A > B ? A : B, S...); } template istream& operator >> (istream& in, ve &v) { for (auto &x : v) in >> x; return in; } template ostream& operator<<(ostream& in, ve &v) { for (auto &x : v) in << x << " "; return in; } long long fast(long long a, long long b, long long pr) { if (b == 0) return 1 % pr; long long ans = 1 % pr; while (b) { if (b & 1) { ans *= a; ans %= pr; } b >>= 1; a *= a; a %= pr; } return ans; } int readInt() { int m = 0; scanf("%d",&m); return m; } long long inv_(long long val) { return fast(val, mod - 2, mod); } // Code code code char S[100001]; int Z = 2 + 1e6; int *fact = new int[Z + 1]; int *invfact = new int[Z + 1], *mod_inv = new int[Z + 1]; class solve { public: solve() { ve v[26]; scanf("%s",&S); int n=strlen(S); for(int i=0;i<26;i++) { v[i].resize(n+1); } for(int i=0;i R(26); for(int i=0;i &v) { int Len=0; ve Tpe; int r=0; for(int i=0;i<26;i++) { if(v[i]/2) { Len+=v[i]/2; Tpe.push_back(v[i]/2); } v[i]%=2; if(v[i]) ++r; } long long ans=fact[Len]; for(int i=0;i