Modular Inverse

Time Limit: 2 Seconds      Memory Limit: 65536 KB

The modular modular multiplicative inverse of an integer a modulo m is an integer x such that a-1x (mod m). This is equivalent to ax≡1 (mod m).

Input

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.

Output

For each test case, output the smallest positive x. If such x doesn't exist, output "Not Exist".

Sample Input

3
3 11
4 12
5 13

Sample Output

4
Not Exist
8

References

http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html

#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
int e_gcd(int a, int b, int &x, int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int r=e_gcd(b, a%b, x, y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return r; 
}
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;
}

 

posted on 2016-03-27 17:56  cleverbiger  阅读(165)  评论(0)    收藏  举报