You are viewing a single comment's thread. Return to all comments →
#include <cstdio> #include <cmath> #include <iostream> #include <set> #include <algorithm> #include <vector> #include <map> #include <cassert> #include <string> #include <cstring> #include <queue> using namespace std; #define rep(i,a,b) for(int i = a; i < b; i++) #define S(x) scanf("%d",&x) #define S2(x,y) scanf("%d%d",&x,&y) #define P(x) printf("%d\n",x) #define all(v) v.begin(),v.end() #define FF first #define SS second #define pb push_back #define mp make_pair typedef long long int LL; typedef pair<int, int > pii; typedef vector<int > vi; const int mod = 1000000007; const int N = 100005; LL F[N], IF[N]; LL _pow(LL a, LL b) { if(!b) return 1; if(b == 1) return a; if(b == 2) return a * a % mod; if(b & 1) { return a * _pow(a,b-1) % mod; } return _pow(_pow(a,b/2),2); } void pre() { F[0] = 1; rep(i,1,N) { F[i] = i * F[i-1] % mod; } IF[N - 1] = _pow(F[N - 1], mod - 2); for(int i = N - 2; i >= 0; i--) { IF[i] = IF[i + 1] * (i + 1) % mod; } } int X[26][N]; int main() { pre(); string s; cin >> s; int n = s.size(); rep(i,0,n) { rep(j,0,26) X[j][i+1] = X[j][i]; X[s[i]-'a'][i+1]++; } int q; S(q); while(q--) { int l,r; S2(l,r); int tot = 0; LL ans = 1; int odd = 0; rep(i,0,26) { int x = X[i][r] - X[i][l-1]; odd += (x&1); ans *= IF[x / 2]; ans %= mod; tot += x / 2; } ans *= F[tot]; ans %= mod; if(odd) ans = ans * odd % mod; printf("%lld\n",ans); } return 0; }
Seems like cookies are disabled on this browser, please enable them to open this website
Maximum Palindromes
You are viewing a single comment's thread. Return to all comments →