写两个高斯消元的热身题.主要是熟悉下高斯消元...呜呜呜,当初学的ex_gcd和中国剩余定理都忘了QAQ.
刷完进阶指南萌新打算刷kuangbin QAQ
水题1:207.球形空间产生器
思路:
(x1-a[0][0])^2+(x2-a[0][1])^2+(x3-a[0][2])^2+...+(xn-a[0][n-1])^2=xn+1^2 (1)
(x1-a[1][0])^2+(x2-a[1][1])^2+(x3-a[1][2])^2+...+(xn-a[1][n-1])^2=xn+1^2 (2)
(x1-a[2][0])^2+(x2-a[2][1])^2+(x3-a[2][2])^2+...+(xn-a[2][n-1])^2=xn+1^2 (3)
...
(x1-a[n][0])^2+(x2-a[n][1])^2+(x3-a[n][2])^2+...+(xn-a[n][n-1])^2=xn+1^2 (n+1)
我们拿(2)~(n+1)对(1)求差.即可化为n个n-1元方程组.
2(a[0][j]-a[i][j])x1+2(a[0][j]-a[i][j])x2+2(a[0][j]-a[i][j])x3+...2(a[0][j]-a[i][j])xn=求和(1-n)(a[i][j]-a[0][j])^2
大概就是n个这样的方程.
然后就是解方程了!

//水题练手1.
#include <bits/stdc++.h>
using namespace std;
const int N=15;
double a[N][N];
double b[N][N];
const double eps=1e-6;
int n;
void geuss()
{
    int c,r;
    for(c=0,r=0;c<n;c++)
    {
        int t=r;
        for(int i=r+1;i<n;i++)
        {
            if(fabs(b[i][c])>fabs(b[t][c])) t=i;
        }
        for(int i=0;i<=n;i++)   swap(b[t][i],b[r][i]);
        if(fabs(b[t][c])<=eps) continue;
        for(int i=n;i>=c;i--)   b[r][i]/=b[r][c];
        for(int i=r+1;i<n;i++)
        {
            for(int j=n;j>=c;j--)
            {
                b[i][j]-=b[i][c]*b[r][j];        
            }
        }
        r++;
    }
    for(int i=n-1;i>=0;i--)
    {
        for(int j=i+1;j<n;j++)
        {
            b[i][n]-=b[j][n]*b[i][j];
        }
    }
}

int main()//n行 n+1列
{
    cin>>n;
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%lf",&a[i][j]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<n;j++)
        {
            b[i-1][j]=2*(a[i][j]-a[0][j]);
            b[i-1][n]+=(a[i][j]*a[i][j]-a[0][j]*a[0][j]);
        }
    }
    geuss();
    for(int i=0;i<n;i++) printf("%.3lf ",b[i][n]);
    cout<<endl;
    return 0;
}