VIJOS 1052贾老二算算术 (高斯消元)

时间:2023-12-26 12:48:01

描述

贾老二是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决 2x=2 这样的方程游刃有余,但是对于 {x+y=3 x-y=1} 这样的方程组就束手无策了。于是他要你来帮忙。前提是一次方程组且保证在integer的范围内可以处理所有问题。

格式

输入格式

第一行一个数字N(1≤N≤100)表示要求的未知数的个数,同时也是所给的方程个数。

第2到N+1行,每行N+1个数。前N个表示第1到N个未知数的系数。第N+1个数表示N个未知数乘以各自系数后的加和。(保证有唯一整数解)

输出格式

一行N个数,表示第1到N个未知数的值。

模板题!

 #include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
double a[][];
int n;
int gcd(int a,int b){
if (b==) return a;
else return gcd(b,a%b);
}
void gauss(){
int now=,to,ggcd;
double t;
for (int i=;i<=n;i++){
for (to=now;to<=n;to++) if (a[to][i]!=) break;
if (to>n) continue;
if (to!=now) for (int j=;j<=n+;j++) std::swap(a[to][j],a[now][j]);
t=a[now][i];
for (int j=;j<=n+;j++) a[now][j]/=t;
for (int j=;j<=n;j++)
if (j!=now){
t=a[j][i];
for (int k=;k<=n+;k++)
a[j][k]-=t*a[now][k];
}
now++;
}
}
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++){
for (int j=;j<=n+;j++)
scanf("%lf",&a[i][j]);
}
gauss();
for (int i=;i<=n;i++)
printf("%d ",(int)round(a[i][n+]));
}