求解ax+by=c 返回0为无解
某一定理:若gcd(a,b)=1,用扩展欧几里得算法求出一组x0,y0。接着,该方程的任意一个解为
x=x0+b*t;
y=y0-a*t;
可以看出解有无数个。
但是若gcd(a,b)!=1呢?
今天看到一个题,讲的是
返回gcd(a,b)个解,用X[],Y[]存;
用到了一种方法:
x[i]=(x0+b/gcd(a,b)*t)%b;
y[i]=(c-a*x[k])/b;
这样用来输出gcd(a,b)个解。
#include<bits/stdc++.h>
# define ll long long
const int N =10000;
using namespace std;
int extend_Euclid(int a, int b, int &x, int &y)
{
if(b==0)
{
x = 1;
y = 0;
return a;
}
int r = extend_Euclid(b, a%b, y, x);
y -= a/b*x;
return r;
}
int X[N], Y[N];
int equation(int a, int b, int c)
{
int x, y;
int g = extend_Euclid(a, b, x, y);
if(c % g)
return 0; //表示无解
x *= c/g, y *= c/g;
for(int k = 0; k < g; k++)
{
X[k] = (x+b/g*k)%b;
Y[k] = (c-a*X[k])/b;
}
return g;
}
int main()
{
int a,b,c;
cin>>a>>b>>c;
cout<<equation( a, b, c)<<endl;
int g=equation( a, b, c);
for(int k = 0; k < g; k++)
{
cout<<X[k]<<" ";
cout<<Y[k]<<endl;
}
return 0;
}