一道求逆元的题目,先用O(n)的时间求出每个位置处的hash值
对于每个输入a和b
ans = hash(b)/hash(a-1);
这里需要使用求逆元的知识,用扩展欧几里德,或是费马小定理
///AC代码 /* *********************************************** ┆ ┏┓ ┏┓ ┆ ┆┏┛┻━━━┛┻┓ ┆ ┆┃ ┃ ┆ ┆┃ ━ ┃ ┆ ┆┃ ┳┛ ┗┳ ┃ ┆ ┆┃ ┃ ┆ ┆┃ ┻ ┃ ┆ ┆┗━┓ 马 ┏━┛ ┆ ┆ ┃ 勒 ┃ ┆ ┆ ┃ 戈 ┗━━━┓ ┆ ┆ ┃ 壁 ┣┓┆ ┆ ┃ 的草泥马 ┏┛┆ ┆ ┗┓┓┏━┳┓┏┛ ┆ ┆ ┃┫┫ ┃┫┫ ┆ ┆ ┗┻┛ ┗┻┛ ┆ ************************************************ */ #include <iostream> #include <set> #include <map> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <bitset> #include <string> #include <vector> #include <iomanip> #include <cstring> #include <algorithm> #include <functional> #define PI acos(-1) #define eps 1e-8 #define inf 0x3f3f3f3f #define debug(x) cout<<"---"<<x<<"---"<<endl const int MOD = 9973; typedef long long ll; using namespace std; ///费马小定理求逆元 ll PowMod(ll a, ll b, ll MOD) { ll ret = 1; while (b) { if (b & 1) { ret = (ret * a) % MOD; } a = (a * a) % MOD; b >>= 1; } return ret; }//快速幂 char s[100500]; int hashh[100500]; int main() { ///std::ios::sync_with_stdio(false);cin.tie(0); int n; hashh[0] = 1; while (scanf("%d", &n) != EOF) { scanf("%s", s + 1); int len = strlen(s + 1); for (int i = 1; i < len + 1; i++) { hashh[i] = hashh[i - 1] * (s[i] - 28) % MOD; } int start, endd; while (n--) { scanf("%d%d", &start, &endd); ll ans = hashh[endd] * PowMod(hashh[start - 1], MOD - 2, MOD) % MOD; printf("%I64d\n", ans); } } return 0; } /************************************************ ┆ ┏┓ ┏┓ ┆ ┆┏┛┻━━━┛┻┓ ┆ ┆┃ ┃ ┆ ┆┃ ━ ┃ ┆ ┆┃ ┳┛ ┗┳ ┃ ┆ ┆┃ ┃ ┆ ┆┃ ┻ ┃ ┆ ┆┗━┓ ┏━┛ ┆ ┆ ┃ ┃ ┆ ┆ ┃ ┗━━━┓ ┆ ┆ ┃ AC代马 ┣┓┆ ┆ ┃ ┏┛┆ ┆ ┗┓┓┏━┳┓┏┛ ┆ ┆ ┃┫┫ ┃┫┫ ┆ ┆ ┗┻┛ ┗┻┛ ┆ ************************************************ */