#include // c #include // io #include #include #include #include // container #include #include #include #include #include #include // other #include #include #include #include #include using namespace std; using ll =long long; #define ALL(c) (begin(c)),(end(c)) #define REP(i,n) FOR(i,0,n) #define REPr(i,n) FORr(i,0,n) #define FOR(i,l,r) for(int i=(int)(l);i<(int)(r);++i) #define FORr(i,l,r) for(int i=(int)(r)-1;i>=(int)(l);--i) #define EACH(it,o) for(auto it = (o).begin(); it != (o).end(); ++it) #define IN(l,v,r) ((l)<=(v) && (v)<(r)) #define UNIQUE(v) v.erase(unique(ALL(v)),v.end()) //debug #define DUMP(x) cerr << #x << " = " << (x) #define LINE() cerr<< " (L" << __LINE__ << ")" template T pmod(T v,U M){return (v%M+M)%M;} ll gcd_positive(ll a,ll b) { return b == 0 ? a : gcd_positive(b,a%b); } ll gcd(ll a,ll b) { return gcd_positive(abs(a), abs(b)); } // a/b template struct Frac{ T a,b; bool operator <(const Frac& r) const{ return this->a * r.b < this->b * r.a; } bool operator > (const Frac& r) const{ return this->a * r.b > this->b * r.a; } }; bool is_zero_t(map& smap,string& t){ map tmap; for(char c:t)tmap[c]++; for(pair sp:tmap){ char c=sp.first; if(smap[c]= INF) throw exception(); return a * b; } // C(N,K) ll C(ll N,ll K){ ll v=1; for(int i=K-1;i>=0;i--){ ll d = gcd(N - i,K - i); v = mult(v/((K-i)/d),(N-i)/d); } return v; } int main(){ cout < smap;string t; for(char c='a';c<='z';c++)cin >> smap[c]; cin >> t; if(is_zero_t(smap,t)){ cout << 0 <= 1 map> tmap; for(int i = 0 ; i< t.size();){ char c=t[i];int count=0; while(i> tp:tmap)sort(ALL(tmap[tp.first])); ll res = 1; try{ for(pair> tp:tmap){ char c=tp.first;vector& tcs=tp.second; ll sc=smap[c]; ll tc=0;for(int v:tcs)tc+=v; ll n = tcs.size(); ll delta = sc - tc; ll v = 1; priority_queue,int> > que; vector scs(n);REP(i,n)scs[i]=tcs[i]; REP(i,scs.size()){ Frac fr={scs[i]+1,scs[i]+1 - tcs[i]}; que.push(make_pair(Frac(fr),i)); } while(!que.empty() && delta >0){ auto p = que.top();que.pop(); ll a = p.first.a,b = p.first.b;int i = p.second; ll d = gcd(a,b); v = mult(v/(b/d),a/d); scs[i]++;delta--; Frac fr={scs[i]+1,scs[i]+1 - tcs[i]}; que.push(make_pair(Frac(fr),i)); } res =mult(res,v); } cout << res <