1. 程式人生 > >擴充套件歐幾里得演算法+獲取特殊的解

擴充套件歐幾里得演算法+獲取特殊的解

通過擴充套件歐幾里得演算法獲取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; }