gcd + 擴展歐幾里得定理+遞推乘法逆元(模板)

gcd:

int gcd(int a, int b){ return b==0? a: gcd(b, a%b); }

 

擴張歐幾里得定理:

擴展歐幾里德算法是用來在已知a, b求解一組x,y使得ax+by = Gcd(a, b) =d(解一定存在,根據數論中的相關定理)。擴展歐幾里德常用在求解模線性方程及方程組中。

int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
       x=1;y=0;
       return a;
    }
    int r=exGcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return r;
}
int main()
{
    int a, b, c;
    while(cin >> a >> b >> c && a+b+c)
    {
        int x, y;
        int z = exgcd(a, b, x, y);
        cout << x << ' ' << y << ' ' << z << '\n';

        x*=c/z;     //一組解x,y
        y*=c/z;
        cout << x << ' ' << y << '\n';

        int t = b/z;        //求ax+by = c 的最小正整數x
        x = (x%t+t)%t;
        y = abs((a*x - c)/b);

        t = a/x;             //求ax+by = c 的最小正整數y
        y = (y%t+t)%t;
        x = abs((b*y - c)/a);
        cout << x << ' ' << y << '\n';
    }
    return 0;

 

遞推版乘法逆元:

ll inv(ll b){ return b == 1? 1: (mod-mod/b)*inv(mod%b)%mod;}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章