【题目大意】

给出$n$个三维向量,设当前向量长度为$L$,每次沿着向量等概率走$[0,L]$个长度。一个球每秒半径增加1个长度,直到覆盖位置,每秒耗能为球体积,求总耗能的期望。

设最后半径为R,那么求得就是$ \int_0^R \frac{4}{3}\pi x^3\, dx.$的期望。

$1 \leq n \leq 3000$

【题解】

也就是求$E(\frac{\pi}{3}R^4)$,问题在于怎么求$E(R^4)$。

先提供一种错误做法及其实现:

我们设向量为$\{p_n\}$,设$x_i$是$(0,1)$等概率随机的。

那么相当于求$E( (\sum_{i=1}^n p_ix_i)^4 )$。

拆出一个数,相当于

$E((\sum_{i=1}^{n-1} p_ix_i + p_nx_n)^4)$

二项式展开,得

$E( (\sum_{i=1}^{n-1}p_ix_i)^4 + 4(\sum_{i=1}^{n-1}p_ix_i)^3(p_nx_n) + 6(\sum_{i=1}^{n-1}p_ix_i)^2(p_nx_n)^2+4(\sum_{i=1}^{n-1}p_ix_i)(p_nx_n)^3 + (p_nx_n)^4)$

所以我们只要维护$p_ix_i$的1~4次方的期望就行了吗?

讲道理是的啊,但是这种做法是错的,只能在所有向量同向的时候是对的。

为什么呢?因为考虑期望中有向量和向量数乘的一项,比如$4(\sum_{i=1}^{n-1}p_ix_i)(p_nx_n)^3$,这是不支持结合律的!!!

所以。。是错的qwq

======================分割线======================

我们接下来讲正确的做法

我们考虑把向量分成三个坐标表示$(a_i,b_i,c_i)$。

求$E(R^4)$还可以看做$E( ((\sum_{i=1}^{n} a_ix_i)^2 + (\sum_{i=1}^{n} b_ix_i)^2 + (\sum_{i=1}^{n} c_ix_i)^2) ^2)$

这样好像正常多了,至少没有向量了。

设当前做到k,当前的$p = \sum_{i=1}^k a_ix_i$,$q = \sum_{i=1}^k b_ix_i$,$r = \sum_{i=1}^k c_ix_i$。

那么也就是求$E( (p^2+q^2+r^2)^2 ) = E(p^4+q^4+r^4+2p^2q^2+2p^2r^2+2q^2r^2)$

设f[x,i,j,k]表示加到第x个向量,$p^i * q^j * r^k$的期望。

那么根据期望的线性性,答案就是f[n,4,0,0]+f[n,0,4,0]+f[n,0,0,4]+2 * (f[n,0,2,2]+f[n,2,0,2]+f[n,2,2,0])

考虑转移,每次加入一个向量,我们试着把其中一项加入当前的$a_ix_i,b_ix_i,c_ix_i$(记为$p',q',r'$)。

$E((p+p')^2(q+q')^2) = E((p^2+2pp'+p'^2)(q^2+2qq'+q'^2)) = E(p^2q^2+ 2p^2qq' + p^2q'^2+2pq^2p' + 4pqp'q' + 2pp'q'^2 + q^2p'^2 + 2qp'^2q' + p'^2q'^2)$

可能已经发现了转移方式了

f[x,i,j,k] = f[x-1, i-A, j-B, k-C] * E(A, B, C) * C(i, A) * C(j, B) * C(k, C)

E(a,b,c)表示$p'^A * q'^B * r'^C$的期望,根据定义显然就是求$E(a_i^Ab_i^Bc_i^Cx_i^{A+B+C})$的期望。

这里$x_i$是$(0,1)$的变量,所以$E(x_i^p) = 1/(p+1)$。由于$x_i$和前面几个x都是互相独立的,所以这时候$E(AB) = E(A)E(B)$.

$a_i^Ab_i^Bc_i^C$都是常数,所以最后答案是$a_i^Ab_i^Bc_i^C / (A+B+C+1)$

然后就可以转移啦。。

复杂度O(n * 常数)

# include <math.h>
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int M = 3e3 + ;
const int mod = 1e9 + ;
const ld pi = acos(-1.0); int C[][], n;
ld f[][][][], E[][][];
ld a[M], b[M], c[M], sa[M], sb[M], sc[M]; // E(R^4) = E( ((∑a_i*x_i)^2 + (∑b_i*x_i)^2 + (∑c_i*x_i)^2)^2 )
// p = ∑a_i*x_i, q = ∑b_i*x_i, r = ∑c_i*x_i
// E(R^4) = E( p^4 + q^4 + r^4 + 2p^2 q^2 + 2p^2 r^2 + 2q^2 r^2 ) // p = p + a_nx_n, q = q + b_nx_n, r = r + c_nx_n // E((a_nx_n) ^ A * (b_nx_n) ^ B * (c_nx_n) ^ C) /*
e.g.
(p+p')^2(q+q'^2)
= (p^2+2pp'+p'^2)(q^2+2qq'+q'^2)
= p^2q^2 + 2p^2q * q' + p^2q'^2 + ...
*/ int main() {
// freopen("find.in", "r", stdin);
// freopen("find.out", "w", stdout);
C[][] = ;
for (int i=; i<=; ++i) {
C[i][] = ;
for (int j=; j<=i; ++j) C[i][j] = C[i-][j] + C[i-][j-];
}
while(cin >> n) {
if(!n) continue;
memset(f, , sizeof f);
int cur = , pre = ;
f[pre][][][] = ;
double Alpha, Beta, L;
for (int i=; i<=n; ++i) {
scanf("%lf%lf%lf", &Alpha, &Beta, &L);
a[i] = L * cos(Beta) * cos(Alpha), b[i] = L * cos(Beta) * sin(Alpha), c[i] = L * sin(Beta);
}
for (int i=; i<=n; ++i) {
sa[] = sb[] = sc[] = ;
for (int j=; j<=; ++j) {
sa[j] = sa[j-] * a[i];
sb[j] = sb[j-] * b[i];
sc[j] = sc[j-] * c[i];
}
for (int i=; i<=; ++i)
for (int j=; i+j<=; ++j)
for (int k=; i+j+k<=; ++k)
E[i][j][k] = sa[i] * sb[j] * sc[k] / (i+j+k+);
for (int i=; i<=; ++i)
for (int j=; i+j<=; ++j)
for (int k=; i+j+k<=; ++k) {
f[cur][i][j][k] = ;
for (int x=; x<=i; ++x)
for (int y=; y<=j; ++y)
for (int z=; z<=k; ++z)
f[cur][i][j][k] += f[pre][i-x][j-y][k-z] * E[x][y][z] * C[i][x] * C[j][y] * C[k][z];
}
swap(pre, cur);
}
ld ans = f[pre][][][] + f[pre][][][] + f[pre][][][] + 2.0 * (f[pre][][][] + f[pre][][][] + f[pre][][][]);
ans = ans / 3.0 * pi;
printf("%.9lf\n", (double)ans);
}
return ;
}

下面这份是只能过共线的代码:

# include <math.h>
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int M = 3e3 + , N = 1e5 + ;
const int mod = 1e9 + ;
const double pi = acos(-1.0); int n; struct vec {
bool f;
double a, b, c;
vec() {}
inline void set(bool _f, double _a, double _b = 0.0, double _c = 0.0) {
f = _f;
a = _a, b = _b, c = _c;
}
friend vec operator + (vec a, vec b) {
vec ret;
if(a.f && b.f) ret.set(, a.a+b.a, a.b+b.b, a.c+b.c);
else ret.set(, a.a+b.a);
return ret;
}
friend vec operator * (vec a, vec b) {
vec ret;
if(a.f && b.f) ret.set(, a.a * b.a + a.b * b.b + a.c * b.c);
if(a.f && !b.f) ret.set(, a.a * b.a, a.b * b.a, a.c * b.a);
if(!a.f && b.f) ret.set(, a.a * b.a, a.a * b.b, a.a * b.c);
if(!a.f && !b.f) ret.set(, a.a * b.a);
return ret;
}
friend vec operator * (vec a, double b) {
vec ret;
if(a.f) ret.set(, a.a*b, a.b*b, a.c*b);
else ret.set(, a.a*b);
return ret;
}
friend vec operator / (vec a, double b) {
vec ret;
if(a.f) ret.set(, a.a/b, a.b/b, a.c/b);
else ret.set(, a.a/b);
return ret;
}
inline void out() {
if(f) printf("%lf, %lf, %lf\n", a, b, c);
else printf("%lf\n", a);
}
}p[M][], a[M], f[M][]; int main() {
freopen("find.in", "r", stdin);
freopen("find.out", "w", stdout);
while(cin >> n) {
double Alpha, Beta, L;
if(n == ) break;
for (int i=; i<=n; ++i) {
scanf("%lf%lf%lf", &Alpha, &Beta, &L);
a[i].set(, L * cos(Beta) * cos(Alpha), L * cos(Beta) * sin(Alpha), L * sin(Beta));
p[i][] = a[i] / 2.0;
p[i][] = (a[i] * a[i]) / 3.0;
p[i][] = (a[i] * a[i] * a[i]) / 4.0;
p[i][] = (a[i] * a[i] * a[i] * a[i]) / 5.0;
// cout << "i = " << i << endl;
// p[i][1].out();
// p[i][2].out();
// p[i][3].out();
// p[i][4].out();
// cout << endl;
}
/*
ans = 1/3 * pi * E(r^4) E((∑p[i]x[i])^4)
= E((∑p[i]x[i] + p[n]x[n]) ^ 4)
= E((∑p[i]x[i]) ^ 4) + 3E((∑p[i]x[i])^3)E(p[n]x[n]) + 6E((∑p[i]x[i])^2)E((p[n]x[n])^2) + 3E(∑p[i]x[i]) E((p[n]x[n])^3) + E((p[n]x[n])^4) E( (p[i]x[i])^3 )
= */
f[][] = p[][], f[][] = p[][], f[][] = p[][], f[][] = p[][];
for (int i=; i<=n; ++i) {
f[i][] = f[i-][] + p[i][];
f[i][] = f[i-][] + (f[i-][] * p[i][]) * + p[i][];
f[i][] = f[i-][] + (f[i-][] * p[i][]) * + (f[i-][] * p[i][]) * + p[i][];
f[i][] = f[i-][] + (f[i-][] * p[i][]) * + (f[i-][] * p[i][]) * + (f[i-][] * p[i][]) * + p[i][];
} double ans = f[n][].a * pi / 3.0;
printf("%.10lf\n", ans);
} return ;
}

「6月雅礼集训 2017 Day4」寻找天哥的更多相关文章

  1. 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...

  2. 「6月雅礼集训 2017 Day4」暴力大神hxx

    [题目大意] 给出一个n重循环,每重循环有范围$[l, r]$,其中$l$,$r$可能是之前的变量,也可能是常数.求循环最底层被执行了多少次. 其中,保证每个循环的$l$,$r$最多有一个是之前的变量 ...

  3. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  4. 「6月雅礼集训 2017 Day11」delight

    [题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...

  5. 「6月雅礼集训 2017 Day11」jump

    [题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...

  6. 「6月雅礼集训 2017 Day11」tree

    [题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...

  7. 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

    [题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...

  8. 「6月雅礼集训 2017 Day8」route

    [题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...

  9. 「6月雅礼集训 2017 Day8」gcd

    [题目大意] 定义times(a, b)表示用辗转相除计算a和b的最大公约数所需步骤. 那么有: 1. times(a, b) = times(b, a) 2. times(a, 0) = 0 3. ...

随机推荐

  1. windows下cudnn的安装过程

    在CUDA安装成功之后,系统环境变量中会有如下两个变量显示:CUDA_PATH和CUDA_PATH_8 在安装完CUDA之后,到官网下载与其版本对应的CUDNN        下载地址:https:/ ...

  2. databales详解(一)

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  3. error : Web 项目“RealEstate.Web”的 URL“http://localhost:20000”已配置为将 IIS 用作 Web 服务器,但是当前在 IIS Express W

    error  : Web 项目"RealEstate.Web"的 URL"http://localhost:20000"已配置为将 IIS 用作 Web 服务器 ...

  4. PAT L2-028 秀恩爱分得快

    https://pintia.cn/problem-sets/994805046380707840/problems/994805054698012672 古人云:秀恩爱,分得快. 互联网上每天都有大 ...

  5. MindManager2018 修改过期时间 配置文件路径

    路径:C:\Users\likui\AppData\Roaming\MindManager\MindManager2018.ini 文件中记录了安装时间和最后一次启动时间. [MindManager] ...

  6. 第一部分shell编程1基础知识

    ls etc/init.d/ shell脚本的路径 ls /usr/local/apache2/ ls /usr/local/apache2/bin/apachectl 1. shell特性命令历史 ...

  7. tc:逼良为娼

    tc的学习原来是想着直接从用户态学习的,但是万万没想到哇,qdisc class两个概念直接把我给搞晕了,直接看代码吧 调用:tc qdisc add dev tap0 root handle 1: ...

  8. springBoot @Enable*注解的工作原理

    使用注解实现异步 RunnableDemo类 package com.boot.enable.bootenable; import org.springframework.scheduling.ann ...

  9. select、poll、epoll模型对比

    select.poll.epoll模型对比 先说Select:            1.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024. ...

  10. Redis的RDB和AOF持久化

    RDB 持久化:在指定的时间间隔内生成数据集的时间点快照. AOF 持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. RDB 它只保存了 Redis 在某个 ...