ZOJ 3609 Modular Inverse

Modular Inverse

Time Limit:2000MS     MemoryLimit:65536KB     64bitIO Format:%lld& %llu

Description

The modularmodular multiplicative inverse of aninteger a modulo m isan integer x suchthat a-1x (mod m). Thisisequivalent toax≡1 (mod m).

Input

There aremultiple test cases. The first line of input isan integer T ≈2000 indicating the number of test cases.

Each test casecontains two integers 0 < a ≤1000 and 0 < m ≤1000.

Output

For each testcase, output the smallest positive x.If such x doesn'texist, output "Not Exist".

Sample Input

3

3 11

4 12

5 13

Sample Output

4

Not Exist

8

References

 

题目数据不大,可以直接暴力过

训练时候用的扩展欧几里得,在这里顺便回顾一下:

 

对于求最大公约数有gcd(a,b)=gcd(b,a%b),gcd(a,0)=a;

而扩展欧几里得可以求形如ax+by=gcd(a,b)的方程的解,所以对于ax+by=c;如果c!=gcd(a,b)则无解。

       ax1+by1=gcd(a,b)

       bx2+(a%b)y2=gcd(b,a%b)=ax1+by1

       bx2+(a-a/b)y2=ax1+by1

       ax1+by1=ay2+b(x2-a/b*y2)

所以x1=y2 y1=x2-a/b*y2

       b=0时,x=1,y=0

 

代码实现如下:

void extend_gcd(int a,int b,int&x,int&y)
{
    if(b==0)
      { 
     x=1; 
     y=0; 
    } 
    else
      { 
     extend_gcd(b,a%b,x,y); 
      int temp=x; 
     x=y; 
     y=temp-a/b*y; 
    } 
} 


对于本题求ax+bm=1

无解情况:m!=1 && gcd(a,m)!=1或者m==1 && a==1

 

代码如下:

#include<cstdio>

using namespace std;

	int T;
	int a,m;
	int x,y;
	
int gcd(int a,int b)
{
	if (!b)
	{
		return a;
	}
	return gcd(b,a%b);
}	

void extend_gcd(int a,int b)
{
    if(b==0)
	{  
      x=1;  
      y=0;  
    }  
    else
	{  
      extend_gcd(b,a%b);  
      int temp=x;  
      x=y;  
      y=temp-a/b*y;  
    }  
}  
int main()
{
	scanf("%d",&T);
	while (T--)
	{
		scanf("%d%d",&a,&m);
		if (m==1)
		{
			if (!(a%m))
			{
				printf("1\n");
			}
			else
			{
				if (!(m%a))
				{
					printf("%d\n",m/a);
				}
				else
				{
					printf("Not Exist\n");
				}
			}
		}
		else
		{
			if (gcd(a,m)==1)
			{
				extend_gcd(a,m);
				while (x<0)
				{
					x+=m;
				}
				printf("%d\n",x);
			}
			else
			{
				printf("Not Exist\n");
			}
		}
		
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值