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

本文介绍了一种利用费马小定理计算乘法逆元的方法,并通过一个模板题展示了如何求解特定模意义下的逆元。文章还提供了一段C++代码示例,用于解释算法的具体实现。


乘法逆元模板题
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; 
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值