球形空间产生器

球形空间产生器

洛谷&天立OI

思路

奇妙的好题啊!!

推导

首先我们学习孟德尔的遗传定律发现的经验,从一般到特殊。

假设 n=2,三个点的坐标 :(a1,b1),(a2,b2),(a3,b3)

设球心为(x1,x2),半径为 R

易得到以下式子:

(x1a1)2+(x2b2)2=R2x12+x22R2+a12+b12=2a1x1+2b1x2

所以有:

(1)x12+x22R2+a12+b12=2a1x1+2b1x2(2)x12+x22R2+a22+b22=2a2x1+2b2x2(3)x12+x22R2+a32+b32=2a3x1+2b3x2

可见这是一个关于x的二元二次方程组,但是高斯消元是一次的怎么办?

不妨可以这样:

cn=an2+bn2(4)(1)(3)c1c3=(2a12a3)x1+(2b12b3)x2(5)(2)(3)c2c3=(2a22a3)x1+(2b22b3)x2

这样我们就可以得到一个二元一次方程组:

{c1c3=(2a12a3)x1+(2b12b3)x2c2c3=(2a22a3)x1+(2b22b3)x2

接下来就简单啦!直接高斯约旦消元就做出来了!!

但如果n!=2呢?

其实也很简单,我们稍微想一下也可以得到一个nn次方程组:

cn=an2+bn2+cn2+......(x1,x2,x3,x4,,,,,xn)(an,bn,cn,,,,An){c1cn+1=(2a12an+1)x1+(2b12bn+1)x2+(2c12cn+1)x3+.....+(2A12An+1)xnc2cn+1=(2a22an+1)x1+(2b22bn+1)x2+(2c22cn+1)x3+.....+(2A22An+1)xn...cncn+1=(2an2an+1)x1+(2bn2bn+1)x2+(2cn2cn+1)x3+.....+(2An2An+1)xn

这这就是一个高斯消元即可!!!!

CODE

#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
const ll maxn = 10+3;
ll ll_maxn=1e18;
inline ll read_int(){
    ll a=0,f=0,g=getchar();
    while(g<'0'||g>'9'){if(g=='-') f=1;g=getchar();}
    while('0'<=g&&g<='9') a=a*10+g-'0',g=getchar();
    return f ? -a : a;
}

inline void write(ll s,bool f){
    ll top=0,a[40];
    if(s<0) s=-s,putchar('-');
    while(s) a[++top]=s%10,s/=10;
    if(top==0) a[++top]=0;
    while(top) putchar(a[top]+'0'),top--;
    if(f) putchar('\n');
}

int n;
ld a[maxn][maxn];
ld b[maxn][maxn];
ld eps=1e-6;

inline void gaosi(){
	for(int i=1;i<=n;i++){
		int max_set=i;
		for(int e=i+1;e<=n;e++){
			if(fabs(a[e][i])>fabs(a[max_set][i])) max_set=e;
		}
		if(max_set^i) for(int e=i;e<=n+1;e++) swap(a[max_set][e],a[i][e]);
		for(int e=n+1;e>=i;e--) a[i][e]/=a[i][i];
		for(int e=1;e<=n;e++){
			if(e==i) continue;
			for(int k=n+1;k>=i;k--){
				a[e][k]-=a[e][i]*a[i][k];
			}
		}
	}
}

inline void PRINTF(){
	for(int i=1;i<=n;i++) printf("%.3Lf ",a[i][n+1]);
}

inline void read(){
	n=read_int();
	for(int i=1;i<=n+1;i++){
		for(int e=1;e<=n;e++){
			scanf("%Lf",&b[i][e]);
			b[i][n+1]+=b[i][e]*b[i][e];
			b[i][e]*=2;
		}
	}
	for(int i=1;i<=n;i++){
		for(int e=1;e<=n+1;e++){
			a[i][e]=b[i][e]-b[n+1][e];
		}
	}
	gaosi();
	PRINTF();
}

int main (){
	read();
}
posted @   轩Demonmaster  阅读(128)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示