快速幂、快速幂求逆元

快速幂:

a b % p a^b\%p ab%p

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n,a,b,p;
LL qmi(int a,int b,int p){
     
    LL res=1%p;
    while(b){
     
        if(b&1) res=res*a%p;
        a=a*(LL)a%p;
        b>>=1;
    }
    return res;
}
int main(){
     
    cin>>n;
    while(n--){
     
        cin>>a>>b>>p;
        cout<<qmi(a,b,p)<<endl;
    }
}

求逆元:

乘法逆元定义:
如果 b , m b,m b,m互质, b ∣ a b\mid a ba,则存在一个整数 x x x使得
a b ≡ a ∗ x ( m o d    m ) \frac{a}{b}\equiv a*x(\mod m) baax(modm)
则称 x x x b b b m m m的乘法逆元记为 b − 1 ( m o d    m ) b^{−1}(\mod m) b1(modm)

性质: b ∗ b − 1 ≡ 1 ( m o d    m ) b*b^{-1}\equiv 1(\mod m) bb11(modm)

b , m b,m b,m不互质不存在逆元

b b b存在乘法逆元的充要条件 b b b与模数 m m m互质。当模数 m m m为质数时, b m − 2 b^{m−2} bm2即为 b b b的乘法逆元。

证明:

因为m是质数,由费马小定理
b m − 1 ≡ 1 ( m o d    m ) b^{m-1}\equiv 1(\mod m) bm11(modm)
拆出一个 b b b
b ∗ b m − 2 ≡ 1 ( m o d    m ) b*b^{m-2}\equiv 1(\mod m) bbm21(modm)
所以逆元 x = b m − 2 x=b^{m-2} x=bm2
快速幂、快速幂求逆元_第1张图片

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int t,a,p,b;
LL qmi(int a,int b,int p){
     
    LL res=1;
    while(b){
     
        if(b&1) res=res*a%p;
        a=a*(LL)a%p;
        b>>=1;
    }
    return res;
}
int main(){
     
    cin>>t;
    while(t--){
     
        cin>>a>>p;
        if(a%p==0) puts("impossible");
        else cout<<qmi(a,p-2,p)<<endl;
    }
}

你可能感兴趣的:(算法)