[CF1279D] Santa's Bot - 概率
Description
给定 N 个集合,程序会等概率选出一个集合 A,在期中等概率选出一个元素 y,同时再等概率选出一个集合 B,求 y 属于 B 的概率。
Solution
统计每个元素在多少个集合里出现,再扫一遍所有元素算贡献
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int qpow(int p, int q) { return (q & 1 ? p : 1) * (q ? qpow(p * p % mod, q / 2) : 1) % mod; }
int inv(int p) { return qpow(p, mod - 2); }
signed main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
map<int, int> mp;
vector<vector<int>> a(n + 2);
for (int i = 1; i <= n; i++)
{
int siz;
cin >> siz;
while (siz--)
{
int x;
cin >> x;
mp[x]++;
a[i].push_back(x);
}
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
int siz = a[i].size();
for (int j : a[i])
ans += mp[j] * inv(n) % mod * inv(n) % mod * inv(siz) % mod;
ans %= mod;
}
cout << ans;
}