Codeforces 1279D Santa's Bot(逆元+概率计算)

题目链接:

Codeforces 1279D Santa’s Bot

思路:

设一共nn个小朋友,对于第ii个礼物,能送给想要的小朋友的概率为1n1kan\frac{1}{n}*\sum\frac{1}{k}*\frac{a}{n}kk分之一的求和是该礼物所在的那些kk的倒数求和,aa是该礼物出现的次数;
最后再将所有礼物计算出来的概率相加即可;
所有分母直接用它的逆元代换计算;

代码:

#include<bits/stdc++.h>
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll powmod(ll a,ll b){ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
#define inv(a) powmod(a,mod-2)
//init
const int maxn=1e6+5;
ll cnt[maxn],sum[maxn];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); 
	int n; cin>>n;
	rp(i,n){
		int k; cin>>k;
		rp(j,k){
			ll x; cin>>x; cnt[x]++;
			sum[x]=(sum[x]+inv(k))%mod;
		}
	}
	ll ans=0;
	rp(i,maxn) ans=(ans+cnt[i]*sum[i]%mod)%mod;
	cout<<ans*inv(n)%mod*inv(n)%mod;
	return 0;
}
posted @ 2019-12-28 18:23  YuhanのBlog  阅读(132)  评论(0编辑  收藏  举报