求解ax+by=c的通解以及x的最小非负整数解

#include
using namespace std;

long long x0, y0;

long long ex_gcd(long long a, long long b, long long& x0, long long& y0)
{
	long long m;
	if (b == 0)
	{
		x0 = 1;
		y0 = 0;
		return a;
	}
	else
	{
		m = ex_gcd(b, a%b, x0, y0);
		long long t = x0;
		x0 = y0;
		y0 = t - a / b*y0;//gcd(a,b)=gcd(b,a%b),对应系数相等
	}
	return m;
}
//g=c/gcd(a,b)
//上述方法求得的是ax+by=c/g,并不是通解
//通解为x=g*x0+mt,y=g*y0-nt
//其中m=b/g,n为a/g
//由于x=g*x0+mt,t可以任意取值,如果取整数的话,该式等价于x%m=g*x0;
//最小非负整数解就是(g*x0+m)%m;

你可能感兴趣的:(数论,知识点)