【JSOI2008】 球形空间产生器—题解

题目:P4035

高中解析几何题

题意:求出一个n元组,满足:

根据高中数学常用套路,我们对上面这n+1个方程两两做差,可以消去常数C,得到如下n个一次方程:

对这个线性方程组使用高斯消元,解出未知数即可。

代码:

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define D double
#define dg() printf("114514 ")
#define print(x) printf("%d ",x)
#define eps 1e-16
int read() {
    int s=0,w=1; char ch=getchar();
    while(ch<'0' || ch>'9') { if(ch=='-') w=-1; ch=getchar();}
    while(ch>='0' && ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
} 
int n;
D a[20][20];
void init() {
    for(int i=1;i<=n+1;i++) {
        for(int j=1;j<=n;j++) {
            scanf("%lf",&a[i][j]);
            if(i>=2) {
                a[i-1][n+1]+=a[i-1][j]*a[i-1][j]-a[i][j]*a[i][j];
                a[i-1][j]=2*(a[i-1][j]-a[i][j]);
            }
        }
    }
}
void deal() {
    for(int i=1;i<=n;i++) {
        int maxn=i;
        for(int j=i+1;j<=n;j++) if(fabs(a[maxn][i]) < fabs(a[j][i])) maxn=j;
        for(int j=1;j<=n+1;j++) swap(a[i][j],a[maxn][j]);
        for(int j=i+1;j<=n;j++) {
            if(fabs(a[i][i]) < eps) continue;
            D temp=a[j][i]/a[i][i];
            for(int k=i;k<=n+1;k++) {
                a[j][k]-=a[i][k]*temp;
            }
        }
    }
    for(int i=n;i>=1;i--) {
        if(fabs(a[i][i]) < eps) continue;
        a[i][n+1]/=a[i][i];
        for(int j=i-1;j>=1;j--) {
            a[j][n+1]-=a[i][n+1]*a[j][i];
            a[j][i]=0;
        }
    }
}
int main() {
    n=read();
    init();
    deal();
    for(int i=1;i<=n;i++) printf("%.3lf ",a[i][n+1]);
    return 0;
}

 

 

 

 

 

 

 

 

posted @ 2021-10-12 22:29  残碑小筑  阅读(46)  评论(0)    收藏  举报
faults = { minSize : 10, maxSize : 20, newOn : 1000, flakeColor : "#FFFFFF" /* 此处可以定义雪花颜色,若要白色可以改为#FFFFFF */ }, options = $.extend({}, defaults, options); var interval= setInterval( function(){ var startPositionLeft = Math.random() * documentWidth - 100, startOpacity = 0.5 + Math.random(), sizeFlake = options.minSize + Math.random() * options.maxSize, endPositionTop = documentHeight - 200, endPositionLeft = startPositionLeft - 500 + Math.random() * 500, durationFall = documentHeight * 10 + Math.random() * 5000; $flake.clone().appendTo('body').css({ left: startPositionLeft, opacity: startOpacity, 'font-size': sizeFlake, color: options.flakeColor }).animate({ top: endPositionTop, left: endPositionLeft, opacity: 0.2 },durationFall,'linear',function(){ $(this).remove() }); }, options.newOn); }; })(jQuery); $(function(){ $.fn.snow({ minSize: 5, /* 定义雪花最小尺寸 */ maxSize: 80,/* 定义雪花最大尺寸 */ newOn: 200 /* 定义密集程度,数字越小越密集 */ }); });