首页 > 其他 > 详细

高斯消元 整数模板

时间:2019-08-20 21:53:23      阅读:113      评论:0      收藏:0      [点我收藏+]
const int mod = 1e9 + 7;
const int N = 50;
ll ma[N][N];//增广矩阵
ll x[N];//解集
inline ll lcm(ll a,ll b){
    return a/__gcd(a,b)*b;//先除后乘防止溢出
}
//有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1
ll Gauss(ll equ,ll var)
{
    int i,j,k;
    int max_r;//当前这列绝对值最大的行
    int col = 1;//当前处理的列
    ll ta, tb, LCM, temp;
    for(k = 1; k <= equ && col <= var; k++,col++){
        max_r = k;
        for(i = k+1;i <= equ;i++){
            if(abs(ma[i][col]) > abs(ma[max_r][col])) max_r = i;
        }
        if(max_r!=k){
            for(j = k; j <= var+1; j++) swap(ma[k][j],ma[max_r][j]);
        }
        if(!ma[k][col]){//说明该col列第k行一下全是0了,则处理当前行的下一列
            k--;
            continue;
        }
        for(i = k+1; i <= equ; i++){
            if(ma[i][col]){
                LCM = lcm(abs(ma[i][col]),abs(ma[k][col]));
                ta = LCM/abs(ma[i][col]);
                tb = LCM/abs(ma[k][col]);
                if(ma[i][col]*ma[k][col] < 0) tb = -tb;//异号的情况是相加
                for(j = col;j <= var+1;j++){
                    ma[i][j] = ((ma[i][j]*ta-ma[k][j]*tb)%mod+mod)%mod;
                }
            }
        }
    }
    //1.无解
    for(i = k; i <= equ; i++){
        if(ma[i][col]!=0) return -1;
    }
    //2.无穷解
    if(k <= var) return var-k;//自由变元有(var-k)个
    //3.唯一解
    for(i = var; i >= 1; i--){
        temp = ma[i][var];
        for(j = i+1; j <= var; j++){
            if(ma[i][j]!=0) temp -= ma[i][j]*x[j];
        }
        //if(temp%ma[i][i] != 0) return -2; 说明有浮点数解,但无整数解.
        x[i] = temp/ma[i][i];
    }
    return 0;
}
int main(){
    int equ,var;
    cin >> equ >> var;
    for(int i = 1;i <= equ;i++){
        for(int j = 1;j <= var+1;j++){
            cin >> ma[i][j];
        }
    }
    int op = Gauss(equ,var);
    if(op == -1) printf("无解\n");
    else if(op > 0) printf("无穷解,自由变元个数为%d\n",op);
    else{
        for(int i = 1; i <= var; i++)
            cout << "x" << i <<   << x[i] << endl;
    }
    return 0;
}

 

高斯消元 整数模板

原文:https://www.cnblogs.com/philo-zhou/p/11385445.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!