NC234903. Ex - Random Painting
描述
输入描述
第一行两个整数 。
之后 行,每行两个整数 。
保证对于第 个格子,存在一个整数 使得 。
输出描述
输出期望值对 取模的结果。
示例1
输入:
3 3 1 1 1 2 2 3
输出:
499122180
说明:
期望值为示例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; }