1. 程式人生 > >除法取模(費馬小定理+擴充套件歐幾里得)

除法取模(費馬小定理+擴充套件歐幾里得)

除法取模

以下只說這兩個方法

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;
}