码迷,mamicode.com
首页 > 其他好文 > 详细

$Luogu$ $P3802$ 小魔女帕琪

时间:2019-10-26 20:59:06      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:class   limit   ret   for   tchar   tail   view   http   背景   

链接

背景

\(orangebird\)\(Luogu\) \(P3802\)

题意

给定 \(7\) 种技能的数量 \(a_i(i \ in [1,7])\) ,规定连续使用 \(7\) 种不同技能后会构成一个必杀,所有必杀互不冲突(即某个位置的某个技能可以在多个不同的必杀技中)。求使用完所有技能后构成必杀的期望次数。

解法

本来是要作为练习题的,观察了很久也没有什么好的做法。无奈看了题解。显然前 \(6\) 次使用技能都是无法构成必杀技的。一个重要结论是从第 \(7\) 次使用技能开始,所有位置构成必杀的概率相等。
一个并不那么简要的证明:
先设 \(\sum_\limits{i \in [1,7]} a_i=n\)
不妨先算出第 \(7\) 次使用技能时构成必杀的概率 \(P_7\) 。先随机一种出技能的序列,就假设为 $ {1,2,3,4,5,6,7 }$ ,那么此时的概率为 $ \frac{a_1}{n} \times \frac{a_2}{n-1} \times \frac{a_3}{n-2} \times \frac{a_4}{n-3} \times \frac{a_5}{n-4} \times \frac{a_6}{n-5} \times \frac{a_7}{n-6} $ 。那么换一种排列的概率呢?假设为 $ {2,1,4,7,6,3,5 }$ ,那么此时的概率为 $ \frac{a_2}{n} \times \frac{a_1}{n-1} \times \frac{a_4}{n-2} \times \frac{a_7}{n-3} \times \frac{a_6}{n-4} \times \frac{a_3}{n-5} \times \frac{a_5}{n-6} $ 。将式子通分后不难发现两种排列的概率是相等的。因此我们根本不关心排列的顺序,所有的概率都是 $ \frac{\prod_\limits{i \in [1,7]}a_i}{\prod_\limits{i \in [0,6]}(n-i)} $ 。
因此, $P_7=7! \times \frac{\prod_\limits{i \in [1,7]}a_i}{\prod_\limits{i \in [0,6]}(n-i)} $ 。
那么,接下来就考虑 \(P_8\) 为多少。由于所有必杀互不冲突,则第 \(8\) 次使用技能时能构成必杀一定是由第 \(2\) 次使用技能开始的一个 \(7\) 阶技能排列构成的。那么,首位的元素就可以随机选择。
当首位为 \(1\) 技能时,构成必杀的概率为 $ \frac{a_1}{n} \times 7! \times \frac{a_1-1}{n-1} \times \frac{a_2}{n-2} \times \frac{a_3}{n-3} \times \frac{a_4}{n-4} \times \frac{a_5}{n-5} \times \frac{a_6}{n-6} \times \frac{a_7}{n-7} $ ,同理,当首位为 \(i(i \in [1,7])\) 技能时,构成必杀的概率为 $ \frac{a_i}{n} \times 7! \times \frac{a_1-[i==1]}{n-1} \times \frac{a_2-[i==2]}{n-2} \times \frac{a_3-[i==3]}{n-3} \times \frac{a_4-[i==4]}{n-4} \times \frac{a_5-[i==5]}{n-5} \times \frac{a_6-[i==6]}{n-6} \times \frac{a_7-[i==7]}{n-7} $ ,因此 \(P_8=\sum_\limits{i \in [1,7]} \{ \frac{a_i}{n} \times 7! \times \frac{a_1-[i==1]}{n-1} \times \frac{a_2-[i==2]}{n-2} \times \frac{a_3-[i==3]}{n-3} \times \frac{a_4-[i==4]}{n-4} \times \frac{a_5-[i==5]}{n-5} \times \frac{a_6-[i==6]}{n-6} \times \frac{a_7-[i==7]}{n-7} \}=\frac{7! \times \prod_\limits{i \in [1,7]}a_i \times (\sum_\limits{i \in [1,7]} a_i-7)}{\prod_\limits{i \in [0,7]} (n-i)}=\frac{7! \times \prod_\limits{i \in [1,7]}a_i}{\prod_\limits{i \in [0,6]} (n-i)}=P_7\) ,使用第 \(i(i \in [7,n])\) 次技能时同理,命题得证。
由于每个“第 \(i(i \in [7,n])\) 次使用技能时构成必杀”这样的随机事件都仅能发生一次,因此答案就是 $\prod_\limits{i \in [7,n]} P_i=(n-6) \times 7! \times \frac{\prod_\limits{i \in [1,7]}a_i}{\prod_\limits{i \in [0,6]}(n-i)} $ , \(O(7)\) 计算即可。

细节

请注意前 \(6\) 次使用技能都是无法构成必杀技的。若 \(n<7\) ,则答案显然为 \(0.000\) 而非 \(-0.000\)

代码

$View$ $Code$ ```cpp #include using namespace std; inline int read() { int ret=0,f=1; char ch=getchar(); while(ch>‘9‘||ch<‘0‘) { if(ch==‘-‘) f=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) { ret=(ret<<1)+(ret<<3)+ch-‘0‘; ch=getchar(); } return ret*f; } int a[8],n; double ans=5040.0; int main() { for(register int i=1;i<=7;i++) { a[i]=read(); n+=a[i]; } if(n<7) { printf("0.000\n"); return 0; } for(register int i=1;i<=7;i++) ans=ans*a[i]/(n-i+1); ans*=(n-6); printf("%0.3lf\n",ans); return 0; } ```

$Luogu$ $P3802$ 小魔女帕琪

标签:class   limit   ret   for   tchar   tail   view   http   背景   

原文地址:https://www.cnblogs.com/Peter0701/p/11745265.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!