Problem A
Accepts: 1663
Submissions: 11605
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
大体题意:
给你个字符串并且告诉你n个查询。
每个查询 有起点和终点,求从起点x到终点y (ASCII码-28)乘积之和对mod 取模的结果!
很明显 肯定要先预处理使得sum[i]表示从第一个点到第i个点的乘积之和!
然后通过sum[y]/ sum[x-1] 就是答案!
但是要通过乘法逆元来得到!
就是sum[y]乘以 sum[x-1]的逆元 来算结果!
因为mod 是素数。
所以逆元就是sum[x-1] ^ (mod-2)%mod
通过快速幂算得即可!
最后结果取模一下就可以了!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod = 9973;
const int maxn = 100000 + 10;
char s[maxn];
int sum[maxn];
int my_pow(int a,int n){
int ans = 1;
while(n){
if (n & 1)
ans = (ans * a)%mod;
n /=2;
a = (a*a)%mod;
}
return ans;
}
int main(){
int n;
while(scanf("%d",&n) == 1 ){
scanf("%s",s+1);
sum[0] = 1;
for (int i = 1; s[i]; ++i){
sum[i] = (sum[i-1] % mod * (s[i]-28) % mod) % mod;
}
while(n--){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",sum[r]%mod*my_pow(sum[l-1],mod-2)%mod);
}
}
return 0;
}