通过扩展欧几里得算法获取x或者y的最小整数解
template<class T> void exgcd(T a,T b,T &d,T &x,T &y){ if(!b) {d=a;x=1;y=0;} else {exgcd(b,a%b,d,y,x);y-=x*(a/b);} } //求解二元一次方程 a*x+b*y=c,一组解为x,y,无解则返回false template<class T> bool Solve_equation(T a,T b,T c,T &x, T& y){ T gcd; exgcd(a,b,gcd,x,y); if(c%gcd) return false; //无解 T k=c/gcd; x*=k;y*=k; T xplus=b/gcd,yplus=a/gcd; if(xplus<0) xplus*=-1;if(yplus<0) yplus*=-1; //此时求出的x,y即为一组解,该方程的通解形式为X=x+t*(b/gcd),Y=y-t*(a/gcd) t为任意正整数 //根据题目要求我们需要构造特殊解 //x=(x%xplus+xplus)%xplus;y=c-a*x; //x的最小正整数解 //y=(y%yplus+yplus)%yplus;x=c-b*y; //y的最小正整数解 return true; }