Solution

这是一道好题.

考虑球体的体积是怎么计算的: 我们令\(f_k(r)\)表示\(x\)维单位球的体积, 则

\[f_k(1) = \int_{-1}^1 f_{k - 1}(\sqrt{1 - r^2}) dr
\]

然而\(f_{k - 1}(\sqrt{1 - x^2})\)并不容易处理, 我们又注意到\(k\)维球体的体积可以表示为\(a \pi r^k\), 因此\(f_k(\sqrt{1 - r^2}) = f_k(1) \times (1 - r)^{\frac k 2}\)

因此递归式变成了这个样子:

\[f_k(1) = \int_{-1}^1 f_{k - 1}(1) \times (1 - r)^{\frac{k - 1}2} dr = f_{k - 1} \int_{-1}^1 (1 - r)^{\frac{k - 1}2} dr
\]

Simpson积分出每个\(f_k(1)\), 递推即可.

哦对了, 差点忘了最后要进行的线性变换. 直接在原来体积的基础上乘上该矩阵行列式的值即可.

#include <cstdio>
#include <algorithm>
#include <cmath>
#define swap std::swap const int D = 19;
const double EPS = 1e-12;
struct determinant
{
double a[D][D];
inline double elemination(int n)
{
double ans = 1;
for(int i = 0; i < n; ++ i)
{
int p = i; for(; p < n && a[p][i] == 0; ++ p);
if(p != i) for(int j = 0; j < n; ++ j) swap(a[i][j], a[p][j]);
for(int j = i + 1; j < n; ++ j) if(a[j][i] != 0)
{
double tmp = a[j][i] / a[i][i];
for(int k = 0; k < n; ++ k) a[j][k] -= tmp * a[i][k];
}
}
for(int i = 0; i < n; ++ i) ans *= a[i][i];
return fabs(ans);
}
}det;
inline double calculate(double a, double x)
{
double res = 1; for(int i = 0; i < x - 1; ++ i) res *= 1 - a * a; return sqrt(res);
}
inline double integrate(double L, double R, double x)
{
double a = calculate(L, x), b = calculate(R, x), c = calculate((L + R) / 2, x);
if(fabs(c * (R - L) - (a + b) * (R - L) / 2) > EPS) return integrate(L, (L + R) / 2, x) + integrate((L + R) / 2, R, x);
else return c * (R - L);
}
inline double work(int d)
{
if(d == 1) return 2;
double lst = work(d - 1);
return lst * integrate(-1, 1, d);
}
int main()
{ #ifndef ONLINE_JUDGE freopen("ball.in", "r", stdin);
freopen("ball.out", "w", stdout); #endif int d; scanf("%d", &d);
for(int i = 0; i < d; ++ i) for(int j = 0; j < d; ++ j) scanf("%lf", &det.a[i][j]);
printf("%.10lf\n", work(d) * det.elemination(d));
}

2016北京集训测试赛(十六)Problem C: ball的更多相关文章

  1. 2016北京集训测试赛(六)Problem B: 矩阵

    Solution 最小割. 参考BZOJ 3144切糕 在那道题的基础上将建图方法稍作变形: 我们对格子进行黑白染色, 对于两个格子之和\(\le k\)的限制, 就可以确定其中一个是白色格子, 一个 ...

  2. 2016北京集训测试赛(六)Problem A: 冒泡排序

    Solution 观察冒泡排序的过程. 我们注意到, 每一轮的排序都会使得每个数后面比它小的数的个数减\(1\). 我们用\(f(n, m)\)表示对\(1\)到\(n\)的一个排列进行冒泡排序, 满 ...

  3. 2016北京集训测试赛(十六)Problem B: river

    Solution 这题实际上并不是构造题, 而是一道网络流. 我们考虑题目要求的一条路径应该是什么样子的: 它是一个环, 并且满足每个点有且仅有一条出边, 一条入边, 同时这两条边的权值还必须不一样. ...

  4. 2016北京集训测试赛(十六)Problem A: 任务安排

    Solution 这道题告诉我们, 不能看着数据范围来推测正解的时间复杂度. 事实证明, 只要常数足够小, \(5 \times 10^6\)也是可以跑\(O(n \log n)\)算法的!!! 这道 ...

  5. 【2016北京集训测试赛(十六)】 River (最大流)

    Description  Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...

  6. 2016北京集训测试赛(十四)Problem B: 股神小D

    Solution 正解是一个\(\log\)的link-cut tree. 将一条边拆成两个事件, 按照事件排序, link-cut tree维护联通块大小即可. link-cut tree维护子树大 ...

  7. 2016北京集训测试赛(十四)Problem A: 股神小L

    Solution 考虑怎么卖最赚钱: 肯定是只卖不买啊(笑) 虽然说上面的想法很扯淡, 但它确实能给我们提供一种思路, 我们能不买就不买; 要买的时候就买最便宜的. 我们用一个优先队列来维护股票的价格 ...

  8. 2016北京集训测试赛(十)Problem A: azelso

    Solution 我们把遇到一个旗子或者是遇到一个敌人称为一个事件. 这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这 ...

  9. 【2016北京集训测试赛(十)】 Azelso (期望DP)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...

随机推荐

  1. Go语言之反射(三)

    结构体转JSON JSON格式是一种用途广泛的对象文本格式.在Go语言中,结构体可以通过系统提供的json.Marshal()函数进行序列化.为了演示怎么样通过反射获取结构体成员以及各种值的过程,下面 ...

  2. 运维自动化之puppet3分钟入门

    运维自动化之puppet3分钟入门 几个月前曾因为项目需求而学了点puppet的一些知识,最近因为要给别人讲一下,也就借此博文来做一下回忆,当然了,这个puppet用起来还是很不错的,尤其对我这种懒人 ...

  3. ogre3D学习基础12 --- 让机器人动起来(移动模型动画)

    学了那么长时间,才学会跑起来.My Ogre,动起来. 第一,还是要把框架搭起来,这里我们用到双端队列deque,前面已经简单介绍过,头文件如下: #include "ExampleAppl ...

  4. c++ primer 6 练习题 (非复习题)

    第7章 7.13-1调和平均数 //7.13-1 excise.cpp 调和平均数 #include <iostream> double calculate(double a,double ...

  5. TextBox的值随dropdownlist值而变化

    转自:http://bytes.com/topic/asp-net/answers/443065-textbox-value-change-select-other-item-dropdownlist ...

  6. [oldboy-django][2深入django]django模板使用函数

    1 模板引入子html--include 模板引擎 - 母版 - include,导入公共的html a. 用法:{% include "pub.html" %}, pub.htm ...

  7. [python][django学习篇][2]创建django app

    推荐学校django博客:http://pythonzh.cn/post/8/ django app 可以理解为一个文件夹: 里面包含了相关功能的代码.通过manage.py来创建 web app 激 ...

  8. ls 的顺序与倒序排列

    linux 中文件夹的文件按照时间倒序或者升序排列 1,按照时间升序 ls -lrt -l use a long listing format 以长列表方式显示(详细信息方式) -t sort by ...

  9. Sina微博OAuth2框架解密

    自从sina微博oauth2出来以后, 第三方集成开发简单了很多. Oauth2不像oauth1一样需要后台httpclient请求那么麻烦, 一切都可以在前台使用ajax实现了. 很多人觉得蹊跷, ...

  10. var和function定义方法的区别

    在JS中有两种定义函数的方式,1是var aaa=function(){...}2是function aaa(){...}var 方式定义的函数,不能先调用函数,后声明,只能先声明函数,然后调用.fu ...