The modular modular multiplicative inverse of an integer a modulo
m is an integer x such that a-1≡x (mod
m). This is equivalent to ax≡1 (mod
m).
There are multiple test cases. The first line of input is an integer T ≈ 2000 indicating the number of test cases.
Each test case contains two integers 0 < a ≤ 1000 and 0 < m ≤ 1000.
For each test case, output the smallest positive x. If such x doesn‘t exist, output "Not Exist".
3 3 11 4 12 5 13
4 Not Exist 8
/** ************************************
//考察知识点:扩展欧几里得算法模板;
求乘法逆元的代码段:
int cal(int a,int b,int c)
{
int x,y;
int gcd=e_gcd(a,b,x,y);
if(c%gcd!=0)
return -1;
x*=c/gcd;
b=abs(b);
int ans=x%b;
if(ans<=0)
ans+=b;
return ans;
}
扩展欧几里德算法模板:
int e_gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ans=e_gcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
***************************************/
#include<stdio.h>
#include<stdlib.h>
int e_gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ans=e_gcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
int cal(int a,int b,int c)
{
int x,y;
int gcd=e_gcd(a,b,x,y);
if(c%gcd!=0)
return -1;
x*=c/gcd;
b=abs(b);
int ans=x%b;
if(ans<=0)
ans+=b;
return ans;
}
int main()
{
int t,a,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&m);
int ans=cal(a,m,1);
if(ans==-1)
printf("Not Exist\n");
else
printf("%d\n",ans);
}
return 0;
} 原文:http://blog.csdn.net/ice_alone/article/details/44263877