期望与概率洛谷p3802

###题面

请注意,无论前 6 个魔法是否已经参与施放终极魔法,只要连续 7 个魔法的属性各不相同,就会再触发一次终极魔法。例如,如果用序号来代表一种魔法,魔法的施放序列为 1, 2, 3, 4, 5, 6,7, 1则前 7 个魔法会触发一次终极魔法,后 7 个魔法会再触发一次终极魔法。

现在帕琪有 7 种属性的能量晶体,第 i 种晶体可以施放出属性为 i 的魔法,共有 a i a_i ai 个。每次施放魔法时,会等概率随机消耗一个现有的能量晶体,然后释放一个对应属性的魔法。

###分析

S = ∑ i = 1 7 a i S=\sum_{i=1}^7a_i S=i=17ai

设施展一次帕琪七重奏的概率为P(A),那么很显然有:

P ( A ) = a 1 S ∗ a 2 S − 1 ∗ a 3 S − 2 ∗ a 4 S − 3 ∗ a 5 S − 4 ∗ a 6 S − 5 ∗ a 7 S − 6 P(A)=\frac{a_1}{S}*\frac{a_2}{S-1}*\frac{a_3}{S-2}*\frac{a_4}{S-3}*\frac{a_5}{S-4}*\frac{a_6}{S-5}*\frac{a_7}{S-6} P(A)=Sa1S1a2S2a3S3a4S4a5S5a6S6a7

但我们发现,每一次可以从任意的元素开始,所以内部的顺序是随机的,这就构成了7的排列,即7!。

P ( A ) = 7 ! ∗ a 1 S ∗ a 2 S − 1 ∗ a 3 S − 2 ∗ a 4 S − 3 ∗ a 5 S − 4 ∗ a 6 S − 5 ∗ a 7 S − 6 P(A)=7!*\frac{a_1}{S}*\frac{a_2}{S-1}*\frac{a_3}{S-2}*\frac{a_4}{S-3}*\frac{a_5}{S-4}*\frac{a_6}{S-5}*\frac{a_7}{S-6} P(A)=7!Sa1S1a2S2a3S3a4S4a5S5a6S6a7

在这个题中,我们可以发现E(A)=P(A),这就具有了很好的性质,因为期望是具有线性可加性的,即:

E ( A + B ) = E ( A ) + E ( B ) E(A+B)=E(A)+E(B) E(A+B)=E(A)+E(B)

我们就可以得到总共的期望【设为E(M)】为:

E ( M ) = 7 ! ∗ a 1 S ∗ a 2 S − 1 ∗ a 3 S − 2 ∗ a 4 S − 3 ∗ a 5 S − 4 ∗ a 6 S − 5 ∗ a 7 S − 6 + 7 ! ∗ a 1 − 1 S − 6 ∗ a 2 − 1 S − 7 ∗ a 3 − 1 S − 8 ∗ a 4 − 1 S − 9 ∗ a 5 − 1 S − 10 ∗ a 6 − 1 S − 11 ∗ a 7 − 1 S − 12 + . . . E(M)=7!*\frac{a_1}{S}*\frac{a_2}{S-1}*\frac{a_3}{S-2}*\frac{a_4}{S-3}*\frac{a_5}{S-4}*\frac{a_6}{S-5}*\frac{a_7}{S-6}+7!*\frac{a_1-1}{S-6}*\frac{a_2-1}{S-7}*\frac{a_3-1}{S-8}*\frac{a_4-1}{S-9}*\frac{a_5-1}{S-10}*\frac{a_6-1}{S-11}*\frac{a_7-1}{S-12}+... E(M)=7!Sa1S1a2S2a3S3a4S4a5S5a6S6a7+7!S6a11S7a21S8a31S9a41S10a51S11a61S12a71+...

每次加一次P(A),相当于在上一次选出的7个数后面补上7个数。

也就是说我们相当于在造一个很长的链:

1,2,3,4,5,6,7,1,2,3,4…

不难发现除了最后6个不行,其他都行。

故为 S − 6 S-6 S6个。

所以最终的答案为

E ( M ) = ( S − 6 ) ∗ 7 ! ∗ a 1 S ∗ a 2 S − 1 ∗ a 3 S − 2 ∗ a 4 S − 3 ∗ a 5 S − 4 ∗ a 6 S − 5 ∗ a 7 S − 6 E(M)=(S-6)*7!*\frac{a_1}{S}*\frac{a_2}{S-1}*\frac{a_3}{S-2}*\frac{a_4}{S-3}*\frac{a_5}{S-4}*\frac{a_6}{S-5}*\frac{a_7}{S-6} E(M)=(S6)7!Sa1S1a2S2a3S3a4S4a5S5a6S6a7

= 7 ! ∗ a 1 S ∗ a 2 S − 1 ∗ a 3 S − 2 ∗ a 4 S − 3 ∗ a 5 S − 4 ∗ a 6 S − 5 ∗ a 7 7!*\frac{a_1}{S}*\frac{a_2}{S-1}*\frac{a_3}{S-2}*\frac{a_4}{S-3}*\frac{a_5}{S-4}*\frac{a_6}{S-5}*a_7 7!Sa1S1a2S2a3S3a4S4a5S5a6a7

#include
using namespace std;
double a[8],ans=1,sum;
int main()
{
	for(int i=1;i<=7;i++) scanf("%lf",&a[i]),sum+=a[i];
	for(int i=1;i<=6;i++)
	{
		ans*=a[i];
		ans/=(sum-i+1);
	}
	ans*=5040;
	ans*=a[7];
	printf("%.3lf",ans);
	return 0;
}

你可能感兴趣的:(算法)