uvalive 6185
高斯消元,以前从来没写过,今天的模拟比赛里面,添琦给了我一个模板!
虽然是个裸的,但是因为从来没写过,一个小细节竟然搞了我几个小时;
终于最后在小珺同志的帮助下成功a掉了,太开心了!
存一下,作为模板!
代码:
1 #include<cstdio> 2 #define maxn 10 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #define eps 0.00001 7 using namespace std; 8 double matrix[maxn][maxn+1]; 9 double ans[maxn]; 10 double a[maxn]; 11 12 void exchange_col(int p1,int p2,int n) 13 { 14 double t; 15 int i; 16 for(int i=0; i<=n; i++) 17 t=matrix[p1][i],matrix[p1][i]=matrix[p2][i],matrix[p2][i]=t; 18 } 19 20 bool gauss(int n) 21 { 22 int i,j,k; 23 int p; 24 double r; 25 for(i=0; i<n-1; i++) 26 { 27 p=i; 28 for(j=i+1; j<n; j++) 29 if(abs(matrix[j][i])>abs(matrix[p][i])) 30 p=j; 31 if(p!=i) 32 exchange_col(i,p,n); 33 if(matrix[i][i]==0) return false; 34 for(j=i+1; j<n; j++) 35 { 36 r=matrix[j][i]/matrix[i][i]; 37 for(k=i; k<=n; k++) 38 matrix[j][k]-=r*matrix[i][k]; 39 } 40 } 41 for(i=n-1; i>=0; i--) 42 { 43 ans[i]=matrix[i][n]; 44 for(j=n-1; j>i; j--) 45 ans[i]-=matrix[i][j]*ans[j]; 46 if(abs(matrix[i][i])<eps)return false; 47 ans[i]/=matrix[i][i]; 48 } 49 return true; 50 } 51 52 int main() 53 { 54 int d; 55 while(scanf("%d",&d)&&d) 56 { 57 memset(matrix,0,sizeof matrix); 58 for(int i=0; i<=d+2; i++) 59 scanf("%lf",&a[i]); 60 for(int k=0; k<=d+2; k++) 61 { 62 int cnt=0; 63 for(int j=0; j<=d+2; j++) 64 { 65 if(k==j) continue; 66 matrix[cnt][d+1]=a[j]; 67 for(int i=0; i<=d; i++) 68 { 69 if(i==0) matrix[cnt][i]=1; 70 else matrix[cnt][i]=matrix[cnt][i-1]*j; 71 } 72 cnt++; 73 } 74 if(!gauss(d+2)) 75 { 76 printf("%d\n",k); 77 break; 78 } 79 } 80 } 81 return 0; 82 }