扩展欧几里得(poj1061)

来源:互联网 发布:淘宝客引流文案 编辑:程序博客网 时间:2024/06/15 15:30

欧几里得算法的拓展应用中有如下三条定理:

   定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y。

   定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。

   定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。


ac代码:

#include <iostream>using namespace std;long long t, p, c;void extend_euild(int a, int b){    if(b == 0)    {        t = 1;        p = 0;        c = a;    }    else    {        extend_euild(b, a%b);        int temp = t;        t = p;        p = temp - a/b*p;    }}int main(){    int i, j, ok = 0, d, a, b;    long long x, y, m, n, l;    freopen("in.txt", "r", stdin);    cin >> x >> y >> m >> n >> l;        if(n == m)        ok = 1;    else{        a = n-m;        d = x-y;        b = l;        extend_euild(a, b);        if(d % c !=0)            ok = 1;    }    if(ok)        cout << "Impossible" << endl;    else    {        b = b / c;        d = d / c;        long long v = d * t;        cout << (v%b+b)%b << endl;    }    getch();    return 0;}


0 0
原创粉丝点击