除法取模(费马小定理+扩展欧几里得)

除法取模

以下只说这两个方法

1)费马小定理

a^(p-1)==1(mod)p     a*a^(p-1)=1%M

a/b%mod=a*b^(mod-2)%mod;

只有p,mod为素数时,而一般都为素数。

b^(mod-2)一般用快速幂

typedef long long ll;
ll quick_pow(ll a,ll n)
{
    ll ans=1;
    while(n)
    {
        if(n&1)
        {
            ans*=a;
            ans%=mod;//mod自己设置
        }
        a=a*a%mod;
        n>>=1;
    }
    return ans;
}

2)扩展欧几里得

求a/b%mod=a*b1%mod。b1为b得逆元。利用exgcd(b,mod,x,y);b1=x;由于可能为负所以x=(x+mod)%mod。

扩展欧几里得模板

typedef long long ll;
ll e_gcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    ll ans=e_gcd(b,a%b,y,x);
    y-=x*(a/b);
    return ans;
}

 

你可能感兴趣的:(算法学习,算法模板,数论学习)