题目大意

  有 \(n\) 个 \(n\) 维空间中的球,求这些球的所有公切面。

  保证不会无解或有无穷多组解。

  \(n\leq 10\)

题解

  你可以认为这是一道传统题。

  记公切面为 \(a_1x_1+a_2x_2+\cdots+ a_nx_n=d\),满足 \(\sum_ia_i^2=1\)。

  一个点 \(x_1,x_2,\ldots,x_n\) 到这个面的距离为

\[\frac{\lvert a_1x_1+a_2x_2\cdots +a_nx_n-d\rvert}{\sqrt{a_1^2+a_2^2+\cdots+a_n^2}}
\]

  对于第 \(i\) 个球,有 \(\lvert\sum_{j}a_jx_{i,j}-d\rvert=r\)。

  枚举所有 \(\lvert\sum_{j}a_jx_{i,j}-d\rvert\) 的符号,把绝对值符号去掉。

  然后解方程解出 \(a_i=D_1d+D_2\),带进 \(\sum_ia_i^2=1\) 中解方程就可以解出 \(d\)。

  时间复杂度:\(O(n^32^n)\)。

  直接解方程可能会有奇怪情况,所以要把所有坐标偏移一个值。

代码

const ldb eps=1e-6;
ldb DELTA[]={0,0.235,0.3746,0.1246,0.2153,0.364,0.1253,0.6124,0.164,0.7543,0.35476};
int n;
ldb a[20][20];
ldb r[20];
ldb ans[2100][20][20];
ldb b[20][20];
ldb c[20][20];
ldb e[20];
int cnt;
void gao(ldb d)
{
for(int i=1;i<=n;i++)
e[i]=c[i][n+1]*d+c[i][n+2];
cnt++;
for(int i=1;i<=n;i++)
{
ldb s=0;
for(int j=1;j<=n;j++)
s+=a[i][j]*e[j];
s-=d;
for(int j=1;j<=n;j++)
ans[cnt][i][j]=a[i][j]-s*e[j];
}
}
void calc()
{
memcpy(c,b,sizeof b);
int flag=0;
for(int i=1;i<=n;i++)
{
int x=i;
for(int j=i;j<=n;j++)
if(fabs(c[j][i])>fabs(c[x][i]))
x=j;
if(fabs(c[x][i])<eps)
{
flag=1;
continue;
}
if(x!=i)
swap(c[x],c[i]);
ldb v=1/c[i][i];
for(int j=1;j<=n+2;j++)
c[i][j]*=v;
for(int j=1;j<=n;j++)
if(j!=i)
{
ldb v=c[j][i];
for(int k=1;k<=n+2;k++)
c[j][k]-=c[i][k]*v;
}
}
if(flag)
{
// ldb d;
// for(int i=1;i<=n;i++)
// if(!c[i][i])
// {
// if(flag)
// {
// }
// else
// {
// }
printf("error\n");
return;
}
ldb A=0,B=0,C=0;
for(int i=1;i<=n;i++)
{
A+=c[i][n+1]*c[i][n+1];
B+=2*c[i][n+1]*c[i][n+2];
C+=c[i][n+2]*c[i][n+2];
}
C-=1;
if(fabs(A)<eps)
{
if(fabs(B)<eps)
{
return;
}
ldb d=-C/B;
gao(d);
}
else
{
ldb delta=B*B-4*A*C;
if(delta<-eps)
return;
else
delta=max(delta,(ldb)0);
if(delta<eps)
{
ldb d=-B/(2*A);
gao(d);
}
else
{
ldb d1=(-B+sqrt(delta))/(2*A);
gao(d1);
ldb d2=(-B+sqrt(delta))/(2*A);
gao(d2);
}
}
}
void dfs(int x)
{
if(x>n)
{
calc();
return;
}
for(int i=1;i<=n;i++)
b[x][i]=a[x][i];
b[x][n+1]=1;
b[x][n+2]=r[x];
dfs(x+1);
if(fabs(r[x])<eps)
return;
b[x][n+2]=-r[x];
dfs(x+1);
}
void solve()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%Lf",&a[i][j]);
a[i][j]-=DELTA[j];
}
scanf("%Lf",&r[i]);
}
cnt=0;
dfs(1);
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
printf("%.20Lf ",ans[i][j][k]+DELTA[k]);
printf("\n");
}
}
int main()
{
// freopen("0.in","r",stdin);
int t;
scanf("%d",&t);
while(t--)
solve();
return 0;
}

【THUSC2017】【LOJ2982】宇宙广播 计算几何 高斯消元的更多相关文章

  1. 【THUSC2017】【LOJ2978】杜老师 高斯消元

    题目大意 给你 \(l,r\),求从 \(l\) 到 \(r\) 这 \(r-l+1\) 个数中能选出多少个不同的子集,满足子集中所有的数的乘积是一个完全平方数. 对 \(998244353\) 取模 ...

  2. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  3. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  4. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

  5. [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...

  6. hihoCoder 1196 高斯消元·二

    Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...

  7. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  8. SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元

    [题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...

  9. UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

随机推荐

  1. axios(封装使用、拦截特定请求、判断所有请求加载完毕)

    博客地址:https://ainyi.com/71 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 Node.js 中使用 vue2.0之后,就不再对 vue-resource 更新 ...

  2. 基于Kubernates微服务案例

    企业业务上云的三种架构 容器的三个视角 从运维角度 数据工程师角度 开发角度微服务化 12 Factor Related Reference: https://kubernetes.io/https: ...

  3. 微信H5页面 会被软键盘顶起来

    问题描述:H5页面在微信中打开,input输入框获取焦点时,页面被软键盘顶上去:关闭软键盘时,页面不会自动下来(恢复初始状态) H5页面在微信中初始状态如下图: input输入框获取焦点时,页面被软键 ...

  4. 解决将Excel表导入到SQL Server数据库时出现Text was truncated or one or more characters had no match in the target code错误

    编写python爬虫程序可以在电商.旅游等网站上爬取相关评论数据,这些数据可以用于词云制作.感情词分析.提取关键词等,也可以将爬取下来的数据以自己的方式进行展示.评论数据爬取下来后,就要考虑怎样入库, ...

  5. (详细)华为荣耀4X CHE-TL00H的usb调试模式在哪里打开的步骤

    每当我们使用PC通过数据线链上安卓手机的时候,如果手机没有开启usb开发者调试模式,PC则没能成功读到我们的手机,有时,我们使用的一些功能较强的工具好比之前我们使用的一个工具引号精灵,老版本就需要打开 ...

  6. UI第三方

    自定义下拉刷新控件 - RefreshableView(支持所有控件的下拉刷新)https://blog.csdn.net/cjh_android/article/details/52462367 亲 ...

  7. Python使用Plotly绘图工具,绘制饼图

    今天我们来学习一下如何使用Python的Plotly绘图工具,绘制饼图 使用Plotly绘制饼图的方法,我们需要使用graph_objs中的Pie函数 函数中最常用的两个属性values,用于赋值给需 ...

  8. C#零基础入门-1-安装IDE

    安装VS2017 下载安装,选择C#开发语言,过程略. 也可以使用VS2015

  9. Lua rawget rawset newindex 函数定义和例子

    在绝大多数情况下,我们都不会用到rawget和rawset. 本文的运行环境:lua 5.3 for windows rawset 赋值操作 rawset是在设置值的过程,进行处理,比如:当某个值改变 ...

  10. 如何禁止chrome浏览器http自动转成https 【转】

    Chrome 浏览器 地址栏中输入 chrome://net-internals/#hsts 在 Delete domain security policies 中输入项目的域名,并 Delete 删 ...