题意:中文题不解释。
思路:sum[i]记录1到i的哈希值,求L到R时sum[R]/SUM[L-1],这里取模,要用到乘法逆元。
/* ***********************************************
┆ ┏┓ ┏┓ ┆
┆┏┛┻━━━┛┻┓ ┆
┆┃ ┃ ┆
┆┃ ━ ┃ ┆
┆┃ ┳┛ ┗┳ ┃ ┆
┆┃ ┃ ┆
┆┃ ┻ ┃ ┆
┆┗━┓ 马 ┏━┛ ┆
┆ ┃ 勒 ┃ ┆
┆ ┃ 戈 ┗━━━┓ ┆
┆ ┃ 壁 ┣┓┆
┆ ┃ 的草泥马 ┏┛┆
┆ ┗┓┓┏━┳┓┏┛ ┆
┆ ┃┫┫ ┃┫┫ ┆
┆ ┗┻┛ ┗┻┛ ┆
************************************************ */
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++)
#define per(i,a,b) for (int i=(b),_ed=(a);i>=_ed;i--)
const int inf_int = 2e9;
const long long inf_ll = 2e18;
#define mod 9973
#define ll long long
#define ull unsigned long long
#define maxn 100005
ll sum[maxn];
char s[maxn];
ll quick_mod(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1)
res=(res*a)%mod;
b>>=1;
a=(a*a)%mod;
}
return res;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
scanf("%s",s+1);
sum[0]=1;
for(int i=1;s[i];++i)
{
sum[i]=(sum[i-1]*(s[i]-28))%mod;
}
for(int i=0;i<n;++i)
{
ll l,r;
scanf("%I64d%I64d",&l,&r);
ll ans=sum[r]*(quick_mod(sum[l-1],mod-2)%mod)%mod;
printf("%I64d\n",ans);
}
}
return 0;
}