#include
using namespace std;
int extended_gcd(int a,int b, int &x, int &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
else
{
int gcd = extended_gcd(b, a % b, x, y);
int t=x%mod;
x=y%mod;
y=((t-a/b*x)%mod+mod)%mod;
return gcd;
}
}
int main()
{
int i, x, y;
const int P = 13;
for (i = 1; i < P; ++i)
{
extended_gcd(i, P, x, y);
while (x < 0) x += P;
printf("1 div %d = %d
", i, x);
}
return 0;
}
//很多人可能不明白,为何y=t-a/b*x,考虑gcd(a,b)=ax+by,变形gcd(a,b)=bx+a%by,a%b==a-a/b*b,
//gcd(a,b)=bx+(a-a/b*b)y,于是原代码中的x相当于a,y相当于b,t=x;x=y;y=t-a/b*x 就可以很好的理解了.
//(本人蒻苣,解释有误的地方,请大神指出。
费马小定理求逆元
//费马小定理求逆元
#include
#include
#include
#include
using namespace std;
#define N 1005
int b[N],prime[N],phi[N];
void inint() //求欧拉函数 和 素数
{
int i,j,k,c=0;
memset(b,0,sizeof(b));
for(i=2;i0)
{
if(n&1) r=(r*p)%m;
p=(p*p)%m;
n>>=1;
}
return r;
}
int main()
{
int t,a,i,j,f;
inint();
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&m);
f=0;
if(m==1) //注意 m为1时,逆元都为1
{
puts("1");
continue;
}
for(i=1;;i++)
{
if(prime[i]>a||prime[i]>m) break;
if(a%prime[i]==0&&m%prime[i]==0)
{
f=1;
break;
}
}
if(f) //a和m 不互素,不存在逆元
{
puts("Not Exist");
continue;
}
int x=poww(a,phi[m]-1); //求解 a 模 m 的逆元
x=(x%m+m)%m;
printf("%d
",x);
}
return 0;
}