对于ax+by=c
我们需要求出它的一组解,需要用到扩展gcd()
,我是很难理解数论,所以记录下来一个板子来看:
#include<iostream>
using namespace std;
int Extended_GCD(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int temp;
int gcd=Extended_GCD(b,a%b,y,x);
y-=x*(a/b);
return gcd;
}
int main()
{
//形如 ax+by=c
int a,b,c,x,y;
cin>>a>>b>>c;
int gcd=Extended_GCD(a,b,x,y);
if(c%gcd!=0)
cout<<"无整数解"<<endl;
else
cout<<"该方程的一组最小整数解为:x="<<x*c/gcd<<",y="<<y*c/gcd<<endl;
return 0;
}
例题:同余方程
题解:
ax%b=1这个方程转化一下是 ax-by=1
然后利用扩展gcd()求出最小解x,而后让判断x是否大于0,如果不大于0,x+=b即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll exgcd(ll a,ll b,ll &x,ll&y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-(a/b)*y;
return d;
}
int main()
{
ll a,b,x,y;
scanf("%lld %lld",&a,&b);
ll d=exgcd(a,b,x,y);
while(x<0)
{
x+=b;
}
printf("%lld\n",x);
}