(1)快速幂
/*
给定 n 组 ai,bi,pi,对于每组数据,求出 ai^bi % pi 的值。
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
typedef long long ll;
typedef unsigned long long ull;
int qmi(int a,int b,int p)
{
int ans=1;
while(b)
{
if(b&1) ans=(ll)ans*a%p;
a=(ll)a*a%p;
b>>=1;
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,b,p;
scanf("%d%d%d",&a,&b,&p);
printf("%d\n",qmi(a,b,p));
}
return 0;
}
(2)快速幂求逆元
若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a/b≡a×x(mod m),则称 x 为 b 的模 m 乘法逆元,记为 b−1(mod m)。
b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,b^m−2 即为 b 的乘法逆元。
/*
给定 n 组 ai,pi,其中 pi 是质数,求 ai 模 pi 的乘法逆元,若逆元不存在则输出 impossible。
注意:请返回在 0~p?1 之间的逆元。
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long ll;
typedef unsigned long long ull;
int qmi(int a,int b,int p)
{
int ans=1;
while(b)
{
if(b&1) ans=(ll)ans*a%p;
a=(ll)a*a%p;
b>>=1;
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,p;
scanf("%d%d",&a,&p);
int res=qmi(a,p-2,p);
if(a%p) printf("%d\n",res);//逆元存在的前提是a与p互质
else printf("impossible\n");
}
return 0;
}