码迷,mamicode.com
首页 > 其他好文 > 详细

2106"百度之星"-资格赛

时间:2016-05-17 00:41:23      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

 

技术分享

技术分享

//本题要求:(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

 

2106"百度之星"-资格赛

标签:

原文地址:http://www.cnblogs.com/520xiuge/p/5499979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!