列表

详情


NC234903. Ex - Random Painting

描述

有编号从 1nn 个格子。最初所有的格子都是白色。

同时,有编号从 1mm 个球放在一个盒子里。

我们将重复以下步骤直到所有的格子都被染成黑色:

1. 从盒子中随机拿出一个球
2. 如果球的编号是 x,将编号 的格子染成黑色
3. 将球放回盒子

找到将所有格子染成黑色的期望步骤数,对 998244353 取模。

输入描述

第一行两个整数 
之后 m 行,每行两个整数
保证对于第 i 个格子,存在一个整数 j 使得

输出描述

输出期望值对 998244353 取模的结果。

示例1

输入:

3 3
1 1
1 2
2 3

输出:

499122180

说明:

期望值为 \frac{7}{2}

示例2

输入:

13 10
3 5
5 9
3 12
1 13
9 11
12 13
2 4
9 12
9 11
7 11

输出:

10

示例3

输入:

100 11
22 43
84 93
12 71
49 56
8 11
1 61
13 80
26 83
23 100
80 85
9 89

输出:

499122193

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 248ms, 内存消耗: 1712K, 提交时间: 2023-03-23 13:19:38

#include<bits/stdc++.h>

using namespace std;

using ll = long long;

const ll P = 998244353;
const int maxn = 410;
int sz[maxn][maxn], dp[maxn][maxn];


ll qpow(ll a, ll k = P-2){
	ll ans = 1;
	while(k){
		if(k&1) ans = ans * a % P;
		a = a * a % P, k >>= 1;
	}
	return ans;
}

void solve(){
	int n, m; cin >> n >> m;
	vector<pair<int, int>>interval(m);
	for(auto &[L, R]: interval) cin >> L >> R;

	for(int l = 0 ; l <= n ; l ++){
		for(int r = l+1 ; r <= n ; r ++){
			for(auto &[L, R]: interval){
				if(L>l and L<=r and R>=r) sz[l][r] ++;
			}
		}
	}

	dp[0][0] = -1;
	for(int i = 1 ; i <= n ; i ++){
		for(int j = 1 ; j <= m ; j ++){
			for(int pre = 0 ; pre < i ; pre ++){
				if(sz[pre][i]>j) continue;
				dp[i][j] = (dp[i][j] - dp[pre][j-sz[pre][i]]) % P;
			}
		}
	}

	ll ans = 0;
	for(int i = 1 ; i <= n ; i ++){
		for(int j = 1 ; j <= m ; j ++){
			ans = (ans + dp[i][j] * qpow(j) % P * m) % P;
		}
	}
	cout << (ans+P)%P << endl;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	solve();

	return 0;
}

上一题