例题求解
求解关于x的同余方程a*x≡b(mod m)
未知数指数为1,所以又称为线性同余方程
ax≡b(mod m) ->-> ax-b=km 设k=-y -->>
ax+m*y=b
根据欧几里得定理及其证明,上式有解仅当gcd(a,m)|b
先用欧几里得算法算出一组整数x0,y0满足ax0+my0=gcd(a,m)
x=x0*b/gcd(a,m)就是方程的一个解
方程通解是所有模m/gcd(a,m)与x同余的整数
NOIP2012
本题 a*x≡1(mod b) 求解最小整数解
相当于 b=1,m=b;
ax+by=1 ->有解仅当gcd(a,b)==1 (a,b互质)
之后带入通解式子中用模运算移动至答案区间
#include<iostream>
using namespace std;
typedef long long ll;
ll a,b,x,y;
long long exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll z=x;
x=y;
y=z-y*(a/b);
return d;
}
int main()
{
cin>>a>>b;
exgcd(a,b,x,y);
cout<<(x%b+b)%b<<endl;
return 0;
}