我自己里理解的扩展欧几里德求不定方程的解。
例如求: ax + by = c ;的解
二元一次不定方程的一般形式为ax+by=c。其中 a,b,c 是整数,ab ≠ 0。此方程有整数解的充分必要条件是a、b的最大公约数整除c。设方程的一组整数解 x0,y0;那么该方程的所有整数解为
过程:
当 ax+ by =c ;c不为a和b的最大公约数时;我们按照 ax+by=gcd(a,b);
最后,我们将我们算的的基本整数解x0*(c/(gcd(a,b))倍数。
如图所示:
测试样例:
2x+4y=2;
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
long long exgcd(long long a,long long b,long long &x,long long &y)
{
if (b==0)
{
x=1,y=0;
return a;
}
long long d=exgcd(b,a%b,x,y);
long long tmp=x;
x=y;
y=tmp-a/b*y;
return d;///返回每一组基础解的最大公约数
}
int main(int argc, char* argv[])
{
long long a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
long long x,y,d;
d=exgcd(a,b,x,y);
if (c%d!=0)
printf("No solution!\n");
else
{
a/=d,b/=d,c/=d;
x*=c,y*=c;
printf("基础解: %lld %lld\n",x,y);
printf("一个通解: %lld %lld\n",x+b,y-a);
}
return 0;
}