poj 2891 Strange Way to Express Integers(一元线性同余方程组)

来源:互联网 发布:孤岛危机2配置优化 编辑:程序博客网 时间:2024/05/14 01:43

迭代求解方程组,拿板子就好了

#include <stdio.h>typedef long long LL;const int N = 11110;LL M[N], R[N];LL gcd(LL a, LL b){    return !b ? a : gcd(b, a%b);}LL extgcd(LL a, LL b, LL &x, LL &y){    LL d = a;    if(b)    {        d = extgcd(b, a%b, y, x);        y -= (a/b) * x;    }    else x = 1, y = 0;    return d;}LL linear_congruence(LL M[], LL R[], LL n){    LL m = M[1], r = R[1];    LL x, y, flag = 1;    for(LL i = 2; i <= n; i++)    {        LL d = gcd(m, M[i]), c = R[i] - r;        if(c % d != 0)        {            flag = 0;            break;        }        extgcd(m/d, M[i]/d, x, y);        LL tm = M[i] / d;        x = ((c/d * x) % tm + tm) % tm;        r = r + x*m;        m = m/d * M[i];        r %= m;    }    if(flag) return r?r:r+m;    else return -1;}int main(){    LL m;    while(scanf("%I64d",&m) != EOF)    {        for(LL i = 1; i <= m; ++i)            scanf("%I64d %I64d",&M[i],&R[i]);        printf("%I64d\n",linear_congruence(M, R, m));    }    return 0;}
阅读全文
0 0