题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5685

题意很简单,我们可以直接用一个数组存储到这一位的哈希值,然后很容易想到最终的结果就是H[r]"除以"H[l-1]的值,注意我们这里是取模的乘法,不能直接除的,我们要求出H[l-1]对9973的逆元,有关求逆元的介绍,小编在另一篇ACM_扩展欧几里得算法的文章里有讲到过,不懂得同学可以先去看看。其他的这道题也没什么难点了。


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL __int64
using namespace std;
const LL MOD = 9973;
const int maxn = 100000+5;
char str[maxn];
LL H[maxn];
void exGcd(LL a, LL b, LL &x, LL &y)
{
if(b == 0)
{
x = 1;
y = 0;
return ;
}
exGcd(b, a%b, y, x);
y -= (a/b)*x;
}
int main()
{
int n;
while(scanf("%d",&n) !=EOF)
{
scanf("%s",str);
int len = strlen(str);
H[0] = 1LL;
for(int i=1; i<=len; i++)
H[i] = H[i-1]*(str[i-1]-28)%MOD;
for(int i=0; i<n; i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(a > b) swap(a,b);
LL x, y;
exGcd(H[a-1], MOD, x, y);
x = (x%MOD+MOD)%MOD;
printf("%I64d\n",(H[b]*x)%MOD);
}
}
}