暴力算法会超时O(N*b)
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b,p;
long long res=1;
cin>>a>>b>>p;
while(b--)
res = res * a %p;
cout<<res<<endl;
}
return 0;
}
所以我们不会选择这种方法
我们一般来说就会用快速幂O(n*logb)
#include <iostream>
using namespace std;
long long int qmi(long long int a,int b,int p)
{
long long int res=1;
while(b)//将b转化为2进制
{
if(b&1)
{
res=res*a%p;
}
b>>=1;//b向右移一位
a=a*a%p;
}
return res;
}
int main()
{
long long int i;
ios::sync_with_stdio(false);
scanf("%d",&i);
cin.tie(0);
cout.tie(0);
while(i--)
{
long long int a,b,p;
long long int res;
cin>>a>>b>>p;
res=qmi(a,b,p);
cout<<res<<"\n";
}
return 0;
}
由证明可知:
逆元是指求其对应分式乘法逆元,所以逆元其实可以直接用一个公式解决,但是在此我们用快速幂解决这个问题,如下:
#include <iostream>
using namespace std;
long long int qmi(long long int a,int b,int p)
{
long long int res=1;
while(b)
{
if(b&1)
{
res=res*a%p;
}
b>>=1;
a=a*a%p;
}
return res;
}
int main()
{
long long int i;
ios::sync_with_stdio(false);
scanf("%d",&i);
cin.tie(0);
cout.tie(0);
while(i--)
{
long long int a,p;
scanf("%lld%lld",&a,&p);
if(a%p==0)
{
puts("impossible");
}
else
{
printf("%lld\n",qmi(a,p-2,p));
}
}
return 0;
}