[HDU5685]Problem A
来源:
2016"百度之星" - 资格赛(Astar Round1)
思路:
首先处理出所有前缀的哈希$f$,对于所有的询问$[a,b]$,答案即为$\frac{f[b]}{f[a-1]}$。
哈希值除法可以通过乘逆元实现。
注意循环时不能直接用$strlen(s)$作为判断条件,
因为$strlen()$函数是$O(n)$的复杂度,这样每次循环都会运行一次,就会把$O(n)$的循环退化成$O(n^2)$的。
1 #include<cstdio> 2 const int LEN=100001,mod=9973; 3 char s[LEN]; 4 int f[LEN]={1}; 5 int exgcd(const int a,const int b,int &x,int &y) { 6 if(!b) { 7 x=1; 8 y=0; 9 return a; 10 } 11 int t=exgcd(b,a%b,y,x); 12 y-=a/b*x; 13 return t; 14 } 15 int main() { 16 int n; 17 while(~scanf("%d",&n)) { 18 scanf("%s",s); 19 for(unsigned i=0;s[i];i++) { 20 f[i+1]=f[i]*(s[i]-28)%mod; 21 } 22 while(n--) { 23 int a,b; 24 scanf("%d%d",&a,&b); 25 int x,y; 26 exgcd(f[a-1],mod,x,y); 27 printf("%d\n",f[b]*(x+mod)%mod); 28 } 29 } 30 return 0; 31 }