快速幂用来在Ologk 的时间内求出 a ^ k mod p的值。
先预处理出a ^ 2 ^ 0,a ^ 2 ^ 1 … a ^ 2 ^ logk的值,再根据k的位运算乘a。
代码:
int ksm(int a,int k,int p)
{
int res = 1;
while(k)
{
if(k & 1)
res = (ll)res * a % p;
k >>= 1;
a = (ll)a * a % p;
}
return res;
}
快速幂求逆元:求b mod p 的逆元
条件:b 和 p 互质,p是质数。
设逆元为x,b * x 模 p 同余1,根据费马定理,b ^ (p - 1) 模p 同余1,所以x等于b ^ (p - 2) mod p.
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,a,p;
int ksm(int a,int m,int p)
{
int res = 1;
while(m)
{
if(m & 1)
res = (ll)res * a % p;
m >>=1;
a = (ll)a * a % p;
}
return res;
}
int main()
{
cin>>n;
while(n -- )
{
cin>>a>>p;
int res = ksm(a,p - 2,p);
if(a % p)
cout<<res<<endl;
else
cout<<"impossible"<<endl;
}
return 0;
}