模線性方程組

來源:互聯網
上載者:User

標籤:

韓信點兵

問題:給定了n組除數m[i]和餘數r[i],通過這n組(m[i],r[i])求解一個x,使得x mod m[i] = r[i]

解:

  一開始就直接求解多個方程組的解,比較困難,所以我們從 n = 2 開始遞推

  已知:

x mod m[1] = r[1]x mod m[2] = r[2]

  所以存在兩個數, k[1], k[2]

x = k[1]*m[1] + r[1]x = k[2]*m[2] + r[2]

  因為值相同,所以:

        k[1]*m[1] + r[1] = k[2]*m[2] + r[2]=>    k[1]*m[1] - k[2]*m[2] = r[2] - r[1]

  令 A = m[1], B = m[2], C = r[2] - r[1], x = k[1], y = k[2]  則上式變為 Ax + By = C

  則是擴充歐幾裡德,可以看我之前的一篇部落格http://www.cnblogs.com/ygdblogs/p/5476395.html

 

  由於每兩個方程可以合并成一個,連續操作,轉化為一個方程,即可求解多個方程組的解

  虛擬碼:

M = m[1], R = r[1]For i = 2 .. N     d = gcd(M, m[i])    c = r[i] - R    If (c mod d) Then    // 無解的情況        Return -1    End If    (k1, k2) = extend_gcd(M / d, m[i] / d)    // 擴充歐幾裡德計算k1,k2    k1 = (c / d * k1) mod (m[i] / d)    // 擴充解系    R = R + k1 * M        // 計算x = m[1] * k[1] + r[1]    M = M / d * m[i]     // 求解lcm(M, m[i])    R %= M             // 求解合并後的新R,同時讓R最小End For        If (R < 0) Then     R = R + MEnd IfReturn R

  源碼:

#include<stdio.h>#include<iostream>typedef long long ll;ll m[1010], r[1010], x, y;ll gcd(ll a,ll b){    if(a%b == 0) return b;    return gcd(b, a%b);}void extend_gcd(ll a,ll b){    if(b==0){        x=1;        y=0;    }    else{        extend_gcd(b,a%b);        ll t=x;        x=y;        y=t-(a/b)*x;    }}int main(){    int n;    ll a, b, c, ans, r1;    scanf("%d",&n);    for(int i =0; i<n; i++)        scanf("%lld%lld",&m[i],&r[i]);    a = m[0], r1 = r[0];    for(int i=1; i<n; i++){        b = m[i];        c = r[i] - r1;        ll d = gcd(a, b);        if(c%d){            ans=-1;            break;        }        else{            ll a1 = a/d;            ll b1 = b/d;            ll c1 = c/d;            extend_gcd(a1,b1);            ll x1 = (x*c1)%b1;            if(x1< 0)              x1 += b1;            r1 = a*x1 + r1;            a = a1*b;            ans = r1;        }    }    printf("%lld\n",ans);    return 0;}
View Code

 

模線性方程組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.