百度之星2016资格赛 1001代数取模/逆元/费马小定理


乘法逆元模板题
Ps:费马小定理解决(也可以用扩展欧几里得算法)
逆元 :(a/b) (mod N) = (a * x) (mod N)。 x表示b的逆元。并且 b*x ≡ 1 (mod N )  注意:只有当b与N互质的时候才存在逆元。一般情况下,ax+by=1;得 x为a mod  b 的逆元,y为 b mod a的逆元。

根据费马小定理,对于素数n,任意不是n的倍数的b,都有:   b^(N-1)=1(mod N)

于是可以拆成: b*b^(N-2)=1(mod N)        --------> a/b=a/b*(b*b^(N-2))=a*(b^(n-2))(mod N)

也就是我们要求的逆元为b^(N-2)(mod N)
#include<iostream>
#include<stdio.h>
#define LL long long
#define mo 9973
using namespace std;
LL qmod(LL a,LL b)
{
    LL sum=1;
    while(b)
    {
        if(b&1) sum=(sum*a)%mo;
        b>>=1;
        a=(a*a)%mo; 
    }
    return sum;
}
int main()
{
    int n,i,a,b;
    string str;
    LL s[100005];
    while(scanf("%d",&n)!=EOF)
    {
        cin>>str;
        s[0]=1;
        for(long i=1;i<=str.length();i++)
           s[i]=(s[i-1])*(str[i-1]-28)% mo;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            if(a>b) swap(a,b);
            printf("%ld\n",(s[b]*(qmod(s[a-1],mo-2)%mo))%mo);
        }
    }
    return 0; 
    
}

 

你可能感兴趣的:(百度之星2016资格赛,1001代数取模)