【BZOJ1013】球形空间产生器sphere

时间:2023-01-24 04:05:02

高斯消元模板题

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath> using namespace std; const int maxn=;
const double EPS=1e-;
double G[maxn][maxn];
double a[maxn][maxn];
double ans[maxn];
int n;
double g;
void gauss_jordan(){
int num;
for(int i=;i<n;i++){
num=i;
for(int j=i+;j<=n;j++){
if(fabs(a[j][i])>fabs(a[num][i]))
num=j;
}
for(int j=;j<=n+;j++)
swap(a[i][j],a[num][j]);
for(int j=i+;j<=n;j++){
if(fabs(a[j][i])<=EPS)continue;
double t=a[j][i]/a[i][i];
for(int k=i;k<=n+;k++){
a[j][k]-=a[i][k]*t;
}
}
}
for(int i=n;i>=;i--){
ans[i]=a[i][n+]/a[i][i];
for(int j=i-;j>=;j--){
a[j][n+]-=a[j][i]*ans[i];
}
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n+;i++){
for(int j=;j<=n;j++){
scanf("%lf",&g);
G[i][j]+=-2.0*g;
G[i][n+]+=g*g;
}
}
for(int i=;i<=n;i++){
for(int l=;l<=n+;l++){
a[i][l]=G[i][l]-G[i+][l];
}
a[i][n+]=-a[i][n+]; } /*for(int i=1;i<=n;i++){
for(int j=1;j<=n+1;j++){
printf("%.1f ",a[i][j]);
}
printf("\n");
}*/
gauss_jordan();
for(int i=;i<=n;i++){
printf("%.3f ",ans[i]);
} return ;
}