擴充套件歐幾里得演算法+獲取特殊的解
阿新 • • 發佈:2018-11-29
通過擴充套件歐幾里得演算法獲取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; }