题目:Problem A
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5685
题意:对于一个字符串,定义一个哈希值 (∏是连乘),给一个字符串s,现有n个操作,每次操作询问下标 l 到 r 之间的子串的哈希值,前缀的思想,先预处理出0到每一位的哈希值gi,现在只涉及到g[r]和g[l-1],不过因为涉及到取模操作,所以不能直接除,应该找g[l-1]的逆元e,答案便是g[r]*e%9973。
1 #include<stdio.h> 2 char s[100010]; 3 int a[100010]; 4 int exGcd(int a,int b,int &x,int &y) 5 { 6 if(b==0) 7 { 8 x=1; 9 y=0; 10 return a; 11 } 12 int r=exGcd(b,a%b,x,y); 13 int t=x; 14 x=y; 15 y=t-a/b*y; 16 return r; 17 } 18 int main() 19 { 20 int n; 21 while(scanf("%d",&n)!=EOF) 22 { 23 scanf("%s",s+1); 24 a[0]=1; 25 for(int i=1;s[i];i++) 26 { 27 a[i]=a[i-1]*(s[i]-28)%9973; 28 } 29 int x,y; 30 while(n--) 31 { 32 scanf("%d%d",&x,&y); 33 int l,r; 34 exGcd(a[x-1],9973,l,r); 35 l=(l%9973+9973)%9973; 36 printf("%d\n",a[y]*l%9973); 37 } 38 } 39 return 0; 40 }