快速幂:
求 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 b∣a,则存在一个整数 x x x使得
a b ≡ a ∗ x ( m o d m ) \frac{a}{b}\equiv a*x(\mod m) ba≡a∗x(modm)
则称 x x x为 b b b模 m m m的乘法逆元记为 b − 1 ( m o d m ) b^{−1}(\mod m) b−1(modm)
性质: b ∗ b − 1 ≡ 1 ( m o d m ) b*b^{-1}\equiv 1(\mod m) b∗b−1≡1(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} bm−2即为 b b b的乘法逆元。
证明:
因为m是质数,由费马小定理
b m − 1 ≡ 1 ( m o d m ) b^{m-1}\equiv 1(\mod m) bm−1≡1(modm)
拆出一个 b b b
b ∗ b m − 2 ≡ 1 ( m o d m ) b*b^{m-2}\equiv 1(\mod m) b∗bm−2≡1(modm)
所以逆元 x = b m − 2 x=b^{m-2} x=bm−2
#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;
}
}