您的位置:首页 > 其它

ZOJ 3609 Modular Inverse 解线性模方程

2014-04-28 19:35 260 查看
点击打开链接

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-1≡x (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

模线性方程ax=b (mod n),令d=exgcd(a,n),该方程有解的充要条件为 d | b ,即 b% d==0
方程ax=b(mod n)的最小解 :x=(x*(b/d))%n 

方程ax=b(mod n)的最整数小解: x=(x%(n/d)+n/d)%(n/d)
因为要求输出最小整数,所以如果答案为0的话,肯定是m=1的情况,此情况应输出1.
//0ms	168k
#include<stdio.h>
#include<string.h>
int exgcd(int A,int &x,int B,int &y)
{
int x1,y1,x0,y0;
x0=1;y0=0;
x1=0;y1=1;
int r=(A%B+B)%B;
int q=(A-r)/B;
x=0;y=1;
while(r)
{
x=x0-q*x1;
y=y0-q*y1;
x0=x1;
y0=y1;
x1=x;y1=y;
A=B;B=r;r=A%B;
q=(A-r)/B;
}
return B;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b=1,n,x,y;
scanf("%d%d",&a,&n);
int d=exgcd(a,x,n,y);
if(b%d==0)
{
x=(x%(n/d)+n/d)%(n/d);
if(!x)x++;
printf("%d\n",x);
}
else printf("Not Exist\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: