高斯消元模板

代码及注释:
#define MOD 7

int a[310][310];//a[i][j]表示第i个等式第j个变量前的系数,i、j均从0开始
int ans[310];//答案

int extend_gcd(int A, int B, int &x, int &y)
{
    if (B == 0)
    {
        x = 1, y = 0;
        return A;
    }
    else
    {
        int r = extend_gcd(B, A%B, x, y);
        int t = x;
        x = y;
        y = t - A / B*y;
        return r;
    }
}

int lcm(int A, int B)
{
    int x = 0, y = 0;
    return A*B / extend_gcd(A, B, x, y);
}

void Guass()
{
    int i, j, row, col;
    for (row = 0, col = 0; row < N && col < M; row++, col++)
    {
        for (i = row; i < N; i++)
            if (a[i][col])
                break;
        if (i == N)
        {
            row--;
            continue;
        }
        if (i != row)
            for (j = 0; j <= M; j++)
                swap(a[row][j], a[i][j]);
        for (i = row + 1; i < N; i++)
            if (a[i][col])
            {
                int LCM = lcm(a[row][col], a[i][col]);//利用最小公倍数去化上三角
                int ch1 = LCM / a[row][col], ch2 = LCM / a[i][col];
                for (j = col; j <= M; j++)
                    a[i][j] = ((a[i][j] * ch2 - a[row][j] * ch1)%MOD + MOD)%MOD;
            }


    }
    for (i = row; i < N; i++)//无解
        if (a[i][M] != 0)
        {
            printf("Inconsistent data.\n");
            return;
        }

    if (row < M)//无穷多解
    {
        printf("Multiple solutions.\n");
        return;
    }
    for (i = M - 1; i >= 0; i--)//唯一解时
    {
        int ch = 0;
        for (j = i + 1; j < M; j++)
            ch = (ch + ans[j] * a[i][j] % MOD)%MOD;
        int last = ((a[i][M] - ch)%MOD + MOD)%MOD;
        int x = 0, y = 0;
        int d = extend_gcd(a[i][i], MOD, x, y);
        x %= MOD;
        if (x < 0) x += MOD;
        ans[i] = last*x / d%MOD;
        if (ans[i] < 3) ans[i] += 7;
    }
    for (int i = 0; i < M; i++)
        if (i == 0)
            printf("%d", ans[i]);
        else
            printf(" %d", ans[i]);

    printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值