扩展欧几里得算法模板题 zoj 3609
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
References
/** ************************************ //考察知识点:扩展欧几里得算法模板; 求乘法逆元的代码段: 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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。