[洛谷P3802] 小魔女帕琪 [洛谷P3802] 小魔女帕琪

一.前言

​ 这个8元素魔法体系还让机房同学们讨论了一会是东西方修真、魔法体系的区别hhh,最后还丧心病狂地压了行?

题目链接放这里

二.思路

​ 首先数学期望都给你A到脸上来了,考点很明确。按照一般的思路,(E=sum p_i*a_i),以及递推的做法,我们不妨设(f[i]) 表示以 i 结尾产生七魔法的期望。

​ 那么很显然的,只有从 (f[7]) 开始才有值,这还是欧皇属性,那么可以轻松的算出 (f[7]) .首先来一个基本款(注意是+=,这里计算的是概率,出现次数 (a_i) 默认1不写,基本的乘法原理,并且有(n=sum a_i))。

[f[7]+=frac{a_1}{n}*frac{a_2}{n-1}*frac{a_3}{n-2}*frac{a_4}{n-3}*frac{a_5}{n-4}*frac{a_6}{n-5}*frac{a_7}{n-6} ]

那么很显然的,再举一个基本款

[f[7]+=frac{a_2}{n}*frac{a_1}{n-1}*frac{a_3}{n-2}*frac{a_4}{n-3}*frac{a_5}{n-4}*frac{a_6}{n-5}*frac{a_7}{n-6} ]

其实到这里很多人都看的出来了,对于(f[7]+=p_i)这样的式子,所有的 (p_i) 都是相同的,(毕竟分母分子乘积都不变),不妨令此时的 (p_i)(p) ,那么其实 p 就是在头七个扔出一个固定顺序的七魔法的概率,那么这样的固定顺序出现次数即为7的排列 7!,所以 (f[7]=7!*p).也可以理解为乘法分配率,将乘上的(a_i=1)累加为 7!

​ 其实上面说了那么多有点废话的感觉哈,接下来才是重头戏。

​ 我们试图将求出 (f[7]) 的做法推广到 (f[8]) ,那么很显然的,我们需要先保证 (2-8) 位置的七魔法生效,至于1号位上是什么魔法无所谓。由于先选后选对 (f[8]) 没有影响,所以先把 (2-8) 位置上的选了,再选 1 ,很显然的第一步(选 2-8)的期望=p,那么对于剩下的1号位考虑,则是在 7种魔法中选一种出来为 (f[8]+=p*dfrac{a_x-1}{n-7}),对于2-8的任意排列,1号位的选择都有7种,所以选出一个排列后,(f[8]+=p*sum dfrac{a_x-1}{n-7}),后面一项显然为1,即等价于没出现一个新的排列 (f[8]+=p) ,排列数有 7! 种,所以 (f[8]=7!*p=f[7])

​ 其实第二部分选择的可以不受魔法种类的约束,换而言之,对于 (f[i]) 来说,先选出 i-6~i 这七个魔法,然后第二步选出在剩下的n-7个魔法中选出 i-7 个魔法,即对于第一步的每个排列,有 (f[i]+=p*dfrac{n-7}{n-7}*dfrac{n-8}{n-8}*……),由于排列数有7! 个,所以 (f[i]=p*7!=f[7])

​ 所以

[egin{align} ans&=sum_{i=7}^nf[i]=f[7]*(n-7+1)\&=7!*p*(n-6)\&=7!*frac{a_1}{n}*frac{a_2}{n-1}*frac{a_3}{n-2}*frac{a_4}{n-3}*frac{a_5}{n-4}*frac{a_6}{n-5}*frac{a_7}{n-6}*(n-6)\&=7!*frac{a_1}{n}*frac{a_2}{n-1}*frac{a_3}{n-2}*frac{a_4}{n-3}*frac{a_5}{n-4}*frac{a_6}{n-5}*a_7 end{align} ]

求出ans就好了

三.CODE

#include<bits/stdc++.h>
double a[10],ans=7.0*6*5*4*3*2*1,sum;
int main(){
	for(int i=1;i<=7;++i)std::cin>>a[i],sum+=a[i]*1.0;
	for(int i=1;i<=7&&sum+1-i!=0;++i)ans*=1.0*a[i]/(sum+1-i);
	printf("%.3lf",ans*(sum-6));
	return 0;
}