快速幂
原理:幂的二进制分解
复杂度:O(log(k))O(log(k))O(log(k))
-
二进制为111时,∗a*a∗a
-
每次aaa递推为a∗aa*aa∗a
-
求aaa的kkk次方modpmod pmodp
#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的逆元为bp−2(modp)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;
}
}