//本题要求:(Ar*A2...An)%p,亦即[(A1*A2*...An)/(A1*A2*...Ar-1)]%p,由于A1*A2...An乘积过大,无法求得相除所得的结果
//我们需要用到乘法逆元(a*k≡1 (mod p)的k值就是a关于p的乘法逆元),而乘法逆元有如下定理®:(a*k) mod p结果与(a/b) mod p等价,其中k为b关于p的乘法逆元
//而由费马小定理(已知p是质数且gcd(a, p) = 1,则 ap-1 ≡ 1 (mod p), 所以 a*ap-2 ≡ 1 (mod p))知,a^(p-2)就是a的逆元了求解,利用快速幂运算计算(补充:亦可用扩展欧几里得求解)
//注意具体求a时,应不断对p取mod
#include <stdio.h> #define mod 9973 int n, l, r, h[100001]; char s[100001]; int powermod(int a, int n, int m)//快速幂求k { int r = 1; while (n) { if (n & 1) r = r * a % m; a = a * a % m; n >>= 1; } return r; } int main() { while (scanf("%d",&n) != EOF) { scanf("%s", s); h[0] = 1; for (int i = 0; s[i]; i++) { h[i + 1] = h[i] * (s[i] - 28) % mod; } for (int i = 0; i < n; i++) { scanf("%d%d", &l, &r); printf("%d\n", h[r] * powermod(h[l - 1], mod - 2, mod) % mod); } } return 0; }
定理 ®的证明:
由:b*k≡1 (mod p)有b*k=p*x+1。
k=(p*x+1)/b。
将k代入(a*k) mod p,得:
(a*(p*x+1)/b) mod p
=((a*p*x)/b+a/b) mod p
=[((a*p*x)/b) mod p +(a/b)] mod p
=[(p*(a*x)/b) mod p +(a/b)] mod p//p*[(a*x)/b] mod p=0
参照:http://blog.csdn.net/nickwong_/article/details/38797629 && http://www.cnblogs.com/tiankonguse/archive/2012/08/14/2638949.html && http://blog.csdn.net/jklongint/article/details/51415402
时间: 2024-10-05 23:09:57