且当做模板:
program: #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; //求6789783*x≡2474010 (mod28927591)的所有解 //即是:ax≡b(mod m)的所有解 int ans[1000000]; void exgcd(int a,int b,int &d,int &x,int &y) { if(!b) { x=1,y=0; d=a; return; } else { exgcd(b,a%b,d,x,y); int tmp=x; x=y; y=tmp-(a/b)*y; } } int main() { int a,b,m; int d,x,y; while(cin>>a>>b>>m) { exgcd(a,m,d,x,y); if(b%d) { puts("impossible"); continue; } x=x*(b/d)%m; for(int i=1;i<=d;i++) { ans[i]=(x+(i-1)*m/d)%m; cout<<ans[i]<<' '; } } system("pause"); return 0;}
求 逆元: program: #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; //求乘法逆元 //即是:ax≡1(mod m)的解 int ans[1000000]; void exgcd(int a,int b,int &d,int &x,int &y) { if(!b) { x=1,y=0; d=a; return; } else { exgcd(b,a%b,d,x,y); int tmp=x; x=y; y=tmp-(a/b)*y; } } int main() { int a,b,m; int d,x,y; while(cin>>a>>b>>m) { exgcd(a,m,d,x,y); if(d!=1) { puts("impossible"); continue; } x=x*b%m; if(x<0) x+=m; cout<<x<<endl; } system("pause"); return 0;}
求逆元例子:
定义 如果ab≡1(mod m), 则称b是a的模m逆,
记作a的模m逆是方程ax≡1(mod m)的解.
例:求5的模7逆
做辗转相除法, 求得整数b,k使得 5b+7k=1, 则b是5的模7逆.
计算如下:
7=5+2, 5=2×2+1.
回代 1=5-2×2=5-2×(7-5)= 3×5-2×7,
得 5 -1≡3(mod7).
例:求21的模73逆
做辗转相除法, 求得整数b,k使得 21b+73k=1, 则b是21的模73逆.
计算如下:
73=21*3+10
21=10*2+1
回代 1=21-10*2
1=21-(73-21*3)*2
=21-73*2+6*21
=7*21-73*2
得 21 -1≡7(mod73).
总结:其实通俗的说就是:a*b%m=1,b是a的逆元,那么求b的话就是a*b%m=1的b的最小整数值。即可