题目:http://acm.hdu.edu.cn/showproblem.php?pid=5685
解题思路:前缀积+费马小定理求逆元。
AC代码:
1 #include<iostream>
2 #include<stdio.h>
3 #include<bits/stdc++.h>
4 using namespace std;
5 int MOD=9973;
6 string s;
7 int sum[100050];
8 int quick_pow_mod(int a,int n){
9 int ans=1;
10 int base=a;
11 while(n!=0){
12 if(n&1){
13 ans=(ans*base)%MOD;
14 }
15 base=(base*base)%MOD;
16 n>>=1;
17 }
18 return ans%MOD;
19 }
20 int main(){
21 int n;
22 while(cin>>n){
23 cin>>s;
24 memset(sum,0,sizeof(sum));
25 sum[0]=1;
26 sum[1]=s[0]-28;
27 for(int i=1;i<s.length();i++){
28 sum[i+1]=(sum[i]*(s[i]-28))%MOD;
29 }
30 while(n--){
31 int x,y;
32 scanf("%d %d",&x,&y);
33 cout<<(sum[y]*quick_pow_mod(sum[x-1],MOD-2))%MOD<<endl;
34 }
35 }
36 return 0;
37 }