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