且当做模板:
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的最小整数值。即可