洛谷 P3802 小魔女帕琪

洛谷 P3802 小魔女帕琪

洛谷传送门

题目背景

从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼。

帕琪能熟练使用七种属性(金、木、水、火、土、日、月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从而唱出强力的魔法。比如说为了加强攻击力而将火和木组合,为了掩盖弱点而将火和土组合等等,变化非常丰富。

题目描述

现在帕琪与强大的夜之女王,吸血鬼蕾咪相遇了,夜之女王蕾咪具有非常强大的生命力,普通的魔法难以造成效果,只有终极魔法:帕琪七重奏才能对蕾咪造成伤害。帕琪七重奏的触发条件是:连续施放的 77 个魔法中,如果魔法的属性各不相同,就能触发一次帕琪七重奏。

请注意,无论前 66 个魔法是否已经参与施放终极魔法,只要连续 77 个魔法的属性各不相同,就会再触发一次终极魔法。例如,如果用序号来代表一种魔法,魔法的施放序列为 1, 2, 3, 4, 5, 6,7, 11,2,3,4,5,6,7,1,则前 77 个魔法会触发一次终极魔法,后 77 个魔法会再触发一次终极魔法。

现在帕琪有 77 种属性的能量晶体,第 ii 种晶体可以施放出属性为 ii 的魔法,共有 a_ia**i 个。每次施放魔法时,会等概率随机消耗一个现有的能量晶体,然后释放一个对应属性的魔法。

现在帕琪想知道,她触发帕琪七重奏的期望次数是多少,可是她并不会算,于是找到了学 OI 的你

输入格式

输入只有一行 77 个整数,第 ii 个整数代表 a_ia**i

输出格式

输出一行一个实数代表答案,四舍五入保留三位小数。


题解:

答案公式:

[E=(N-6)P=frac{7! imes prod_{i=1}^7 a_i}{prod_{i=N-5}^{N}} ]

其中N为总魔法石个数,P为长度为N的数字排列中出现帕奇七重奏的概率

为什么是这个式子呢?

我们发现,因为我们是任意构造排列,且每次选魔法石的过程是等概率的。所以对于整个排列来讲,任意7位构成帕奇七重奏的概率是相等的并且互不影响。一共有N-6组。

那么根据排列组合的思想,整个排列中出现帕奇七重奏的概率就是:

[P=frac{7! imes prod_{i=1}^7 a_i}{prod_{i=N-6}^{N}} ]

因为一共有N-6组,所以最终的期望就是上面的那个东西。

直接模拟即可,需要注意溢出和精度的问题。

代码:

#include<cstdio>
using namespace std;
const int qi=5040;
int a[8];
int n;
double ans;
int main()
{
    ans=1.0*qi;
    for(int i=1;i<=7;i++)
    {
        scanf("%d",&a[i]);
        n+=a[i];
        ans*=a[i];
    }
    for(int i=n-5;i<=n;i++)
        ans=ans/(1.0*i);
    printf("%.3lf",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/13841970.html