快速幂
原理:幂的二进制分解
复杂度:
O
(
l
o
g
(
k
)
)
O(log(k))
O(log(k))
-
二进制为 1 1 1时, ∗ a *a ∗a
-
每次 a a a递推为 a ∗ a a*a a∗a
-
求 a a a的 k k k次方 m o d p mod p modp
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll qmi(ll a,ll k,ll p){
ll res=1;
while(k){
if(k&1) res=res*a%p;
k>>=1;
a=a*a%p;
}
return res;
}
int main(){
int n;
scanf("%d",&n);
ll a,k,p;
while(n--){
scanf("%lld%lld%lld",&a,&k,&p);
printf("%lld\n",qmi(a,k,p));
}
}
快速幂求逆元
费马定理
乘法逆元
p为质数时
b的逆元为
b
p
−
2
(
m
o
d
p
)
b^{p-2}(mod p)
bp−2(modp)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll qmi(ll a,ll k,ll p){
ll res=1;
while(k){
if(k&1) res=res*a%p;
k>>=1;
a=a*a%p;
}
return res;
}
int main(){
int n;
scanf("%d",&n);
ll a,k,p;
while(n--){
scanf("%lld%lld",&a,&p);
if(a%p) cout<<qmi(a,p-2,p)<<endl;
else cout<<"impossible"<<endl;
}
}