#include <cstdio> #include <iostream> #include <vector> #include <set> #include <stack> #include <queue> #include <map> #include <math.h> #include <cmath> #include <string> #include <iomanip> #include <cstring> #include <sstream> #include <algorithm> #include <bitset> #include <unordered_map> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; #define inf 1013161010 #define ninf -1013161010 #define mod 1000000007 #define ll long long #define lf long double #define in(x) scanf("%d",&x); #define sz(x) ((int)x.size()) #define lld l64d #define rep(i,n) for(i=0;i<n;i++) #define rrep(i,n) for(i=n-1;i>=0;i--) #define rep1(i,a,b) for(i=a;i<=b;i++) #define rrep1(i,a,b) for(i=a;i>=b;i--) #define stlfor(i,t) for(auto i =t.begin();i!=t.end();i++) #define fr freopen("x.txt","r",stdin) #define frc freopen("y.txt","w",stdout) #define all(x) x.begin(),x.end() #define set0(x) memset(x,0,sizeof(x)) #define dbg cout<<"yo "<<endl; #define pset(n) fixed<<showpoint<<setprecision(n) #define pii pair<int,int> #define pll pair<ll,ll> #define vpii vector<pair<int,int> > #define vpll vector<pair<ll,ll> > #define si set<int> #define mii map<int,int> #define umii unordered_map<int,int> #define vi vector<int> #define pb push_back #define ff first #define ss second #define mp make_pair typedef tree<pii,null_type,less<pii>,rb_tree_tag,tree_order_statistics_node_update> OST; ll toint(const string &s) { stringstream ss; ss << s; ll x; ss >> x; return x; } string tostring ( ll number ){ stringstream ss; ss<< number; return ss.str();} const lf pi = 2*acos(0); const int nn = 2000006; const lf EPS = 0.000000001; ll gcd(ll a,ll b){return (b==0)? a:gcd(b,a%b); } void nope(int num = 0){ if(num==0) cout<<"NO"; else cout<<"-1"; exit(0); } ll a[100010][30]; ll inv[100010], f[100010]; ll fast_pow(ll a,ll m, ll mode) { if(m==0) return 1; else if(m==1) return a; ll h=fast_pow(a,m/2,mode); if(m%2==0) return ((h*h)%mode); else return ((((h*h)%mode)*a)%mode); } ll mmi(ll b, ll mode) { return fast_pow(b, mode-2, mode); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); ll i,j,n,tt; tt=1; //cin>>tt; f[0]=1; f[1]=1; inv[0]=1, inv[1]=1; for(i=2;i<=100000;i++) f[i]=(f[i-1]*i)%mod; for(i=2;i<=100000;i++) inv[i]=mmi(f[i], mod); while(tt--) { string s; cin>>s; s='#'+s; int q; cin>>q; a[1][s[1]-'a']++; n = sz(s); for(i=2;i<n;i++) { for(j=0;j<26;j++) a[i][j] = a[i-1][j]; a[i][s[i]-'a']++; } int l, r; while(q--) { cin>>l>>r; ll tmp[30]; set0(tmp); for(i=0;i<26;i++) tmp[i]=a[r][i]-a[l-1][i]; int cnt=0; ll ans=1; ll odd=0; for(i=0;i<26;i++) { if(tmp[i]%2==1) { odd++; } cnt+=(tmp[i]/2); } //cout<<cnt<<endl; ans=(ans*f[cnt])%mod; //cout<<ans<<endl; for(i=0;i<26;i++) ans=(ans*inv[tmp[i]/2])%mod; if(odd>=1) ans=(ans*odd)%mod; cout<<ans<<endl; } } return 0; }