嘘~ 正在从服务器偷取页面 . . .

洛谷P3802 小魔女帕琪 题解


洛谷P3802 小魔女帕琪 题解

题目链接:P3802 小魔女帕琪

题意

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

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

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

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

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

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

输入格式

输入只有一行 $7$ 个整数,第 $i$ 个整数代表 $a_i$。

输出格式

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

数据范围

对于 $100\%$ 的数据,保证 $0 \leq a_i \leq 10^9$,且 $\sum_{i = 1}^7 a_i \leq 10^9$。

居然是道纯数学题。(有一说一,这个“帕琪七重奏”有种莫名的优雅

注意到每次触发帕琪七重奏其实和之前触发是无关的。因为 $1\sim 7$ 放招了以后,$2 \sim 8$ 还可以放。

考虑前 $7$ 个触发帕琪七重奏的概率。记 $N = \sum a_i$ ,则

前面的 $7!$ 对应了 $a_1,a_2,\cdots,a_7$ 的不同排列,显然这样的次序不会影响触发帕琪七重奏

然后考虑第一个取出的元素固定为 $a_1$ 时,接下来的 $7$ 个触发帕琪七重奏。

再试试固定为 $a_2$ ?

以上 $7!$ 均为第一个元素固定时,第 $2 \sim 8$ 个元素的排列。

而我们可以发现

因此

震惊,每一个连续 $7$ 项的贡献都是一样的。小编也觉得很奇怪,但事实就是这样

而这样的项有 $N-6$ 个,因此最终的答案为

时间复杂度 $\mathcal{O}(1)$

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x,int y) { x < y ? x = y : 0; }
void down(int &x,int y) { x > y ? x = y : 0; }
#define N ((int)())

double s, res = 1, a[15];
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    for(int i=1; i<=7; i++){ cin >> a[i]; s += a[i]; }
    for(int i=1; i<=6; i++) res = res * a[i] / (s + 1 - i) * i;
    res = res * a[7] * 7;
    cout << fixed << setprecision(3) << res << '\n';
    return 0;
}

参考文献

[1] https://www.luogu.com.cn/blog/ButterflyDew/solution-p3802


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录