Solution

直接计算「至少抽到一张想要的卡」的概率非常复杂(需要分类讨论抽中 1 个、2 个...n 个的情况),因此我们用对立事件简化计算:

目标概率 = 1 - 所有卡池都抽不到想要的卡的概率

正难则反,思考对立事件的概率就很容易了,只需要将抽中不想要的卡的概率相乘就是结果了。

分别计算分子,分母,然后用逆元就行了

记得用1减去对立事件的概率才是我们的答案

Code

void solve()
{
    cin >> n;
    vi a(n + 1);
    int zi = 1;//分子
    int mu = 1;//分母
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        mu = mu * a[i] % MOD;
    }
    for (int i = 1; i <= n; i++)
    {
        cin >> x;
        zi = zi * (a[i] - x) % MOD;
    }
    if (zi == 0)
    {
        cout << 1 << endl;
        return;
    }
    cout << (1 - zi * ksm(mu, MOD - 2, MOD) % MOD + MOD) % MOD << endl;//用1-对立事件概率
}