P3802 小魔女帕琪
\(\color{#000088} {东方众不请自来。。。}\)
题意:
帕琪有七种元素,第 \(i\) 个元素有 \(a_i\) 个,帕琪将所有元素排成一排,若有任意连续的 \(7\) 个元素互不相同(就是啥元素都有),就能释放魔法把蕾米淦翻。现在给你每个元素数量,问随机将元素排开期望能淦蕾米多少次。
注意是任意 \(7\) 个连续的,同一个元素在前 \(7\) 个中能组成,在后 \(7\) 个中也能组成,就算释放两次。如:\(12345671\),即可释放两次。
纯数学题,想清题解后代码很好写。
总共期望释放几次 \(=\sum\) 每个位置期望释放几次,当然每个位置只能释放一次。。。就是每个位置可释放的概率。
考虑到由于上一次是否释放对下一次没有任何影响,所以每个位置释放的概率都是独立的。
再思考会发现每个位置其实概率是一样的,因为都是在整个序列中连续的 \(7\) 个数,只是初始位置和结束位置不同而已。如果将这连续的 \(7\) 个数绑在一起,其他的元素全部散开,可以想到无论这 \(7\) 个放在哪里,概率都是相同的。
那么我们只需计算:长度为 \(n\) 的序列,选定的 \(7\) 个数互不相同的概率,答案乘上 \(n-6\) (有 \(n-6\) 个可能释放的位置)。
但这 \(7\) 个数即使绑在一起他们之间的位置也不确定,既然这 \(7\) 个数互不相同,我们可以当做排列处理,将排好顺序的情况数乘上 \(7!\) ,就是位置不确定的情况。
现在问题变成了小学奥数。。。: \(n\) 个数中选出 \(7\) 个数,第一个数是 \(1\),第二个数是 \(2\),第三个数是 \(3\) 。。。的情况数。即 \(\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}\)。
综上:\(Ans = (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}\)
\(Ans=5040*\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 <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define QWQ cout<<"QwQ"<<endl;
#define ll long long
#include <vector>
#include <queue>
#include <stack>
#include <map>
using namespace std;
const int N=201010;
const int qwq=303030;
const int inf=0x3f3f3f3f;
double a[2333],tot;
double ans = 5040.0;
int main() {
for(int i=1;i<=7;i++) scanf("%lf",&a[i]), tot += a[i];
for(int i=1;i<=7;i++) if(!a[i]) { cout<<"0.000"; return 0; }
for(int i=1;i<=7;i++) ans = ans * a[i] / (tot-i+1);
ans *= tot-6;
printf("%.3lf",ans);
return 0;
}