VIJOS 1052贾老二算算术 (高斯消元)
描述
贾老二是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决 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个未知数的值。
模板题!
1 #include<algorithm> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 double a[2005][2005]; 7 int n; 8 int gcd(int a,int b){ 9 if (b==0) return a; 10 else return gcd(b,a%b); 11 } 12 void gauss(){ 13 int now=1,to,ggcd; 14 double t; 15 for (int i=1;i<=n;i++){ 16 for (to=now;to<=n;to++) if (a[to][i]!=0) break; 17 if (to>n) continue; 18 if (to!=now) for (int j=1;j<=n+1;j++) std::swap(a[to][j],a[now][j]); 19 t=a[now][i]; 20 for (int j=1;j<=n+1;j++) a[now][j]/=t; 21 for (int j=1;j<=n;j++) 22 if (j!=now){ 23 t=a[j][i]; 24 for (int k=1;k<=n+1;k++) 25 a[j][k]-=t*a[now][k]; 26 } 27 now++; 28 } 29 } 30 int main(){ 31 scanf("%d",&n); 32 for (int i=1;i<=n;i++){ 33 for (int j=1;j<=n+1;j++) 34 scanf("%lf",&a[i][j]); 35 } 36 gauss(); 37 for (int i=1;i<=n;i++) 38 printf("%d ",(int)round(a[i][n+1])); 39 }