小魔女帕琪

洛咕

题意:给定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;
}

posted on 2019-09-19 20:23  PPXppx  阅读(123)  评论(0编辑  收藏  举报