标签:扩展欧几里得算法模板
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