题意:给定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\n",ans);
return 0;
}