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-对立事件概率
}

京公网安备 11010502036488号