一道数论题,也是道简单题,就是个扩展欧几里得,一直没写过扩展欧几里得的代码,这次还是在朱神的帮助下才写出来的,不过高兴的是1A了,,题目:
Modular Inverse Time Limit: 2 Seconds Memory Limit: 65536 KBThe 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 8ac代码:
#include <iostream> #include <string.h> #include <cstdio> using namespace std; int x,y,q; int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); } int extend_uclid(int a,int b){ if(b==0){ x=1; y=0; q=a; return q; } else{ extend_uclid(b,a%b); int tmp=x; x=y; y=tmp-a/b*y; } } int main(){ //freopen("2.txt","r",stdin); int numcase; int a,m; scanf("%d",&numcase); while(numcase--){ scanf("%d%d",&a,&m); if(m==1){ if(a%m==0){ puts("1"); } else if(m%a==0){ printf("%d\n",m/a); } else{ puts("Not Exist"); } } else{ int flag=gcd(a,m); if(flag!=1)puts("Not Exist"); else{ extend_uclid(a,m); while(x<0){ x+=m; } printf("%d\n",x); } } } return 0; }