题意:给定7个元素各自的数量,每次释放一个元素,一旦连续释放了7个不同的元素,则会释放出七重奏,求释放七重奏的期望次数.
分析:首先提醒一下如果释放元素顺序为1 2 3 4 5 6 7 1,则会有两次七重奏.
设(n=sum_{i=1}^7a[i]).对于每个位置(i),从(i)开始的7个位置中,7个元素都不相同的概率为(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)个这样的位置(i)(即n个数的序列,从前往后,可以划分出n-6段长度为7的段,(1-7),(2-8),...,((n-6)-n)),所以还要除以(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].)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
int n,a[10];
int main(){
for(int i=1;i<=7;++i){
a[i]=read();
n+=a[i];
}
if(n<=6){puts("0.000");return 0;}//好像没有特判数据
double ans=1.000;
for(int i=1;i<=6;++i){
ans=1.0*ans*a[i]/(n+1-i);
}
ans=ans*1.0*2.0*3.0*4.0*5.0*6.0*7.0*a[7];
printf("%.3lf
",ans);
return 0;
}