【ABC242EX】Random Painting
【ABC242EX】Random Painting
by AmanoKumiko
Description
有\(n\)个位置,\(m\)个区间
每次会随机选出一个区间,并把区间的位置变成黑色(初始都为白色)
求把所有位置变成黑色的期望次数对\(998244353\)取模的结果
Input
第一行读入\(n,m\)
然后\(m\)行读入区间
Output
一行一个数表示答案
Sample Input
3 3
1 1
1 2
2 3
Sample Output
499122180
Data Constraint
\(1\le N,M\le 400\)
Solution
第一次用\(min-max\)反演
令\(max\)表示期望把整个集合染黑的次数
\(min\)表示期望第一次染黑集合中任意位置的次数
那么接下来要做的就是设个\(dp\)
令\(f_{i,j}\)表示集合最后一次选了位置\(i\),和集合有交的区间数为\(j\)的容斥系数
枚举上一次选的位置和有交区间数,令其为\(f_{x,y}\)
可以发现,我们的新区间数就是\(y\)减去\(x\)和\(i\)都有交的,加上只和\(i\)有交的
因为在\(i\)之前选的和\(x\)有交的区间也一定会在上面算到
再根据——从\(i\)个元素中选出\(j\)个元素中的任意一个元素的期望次数为\(\frac{i}{j}\)就行了
Code
#include<bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i=a;i<=b;i++)
#define Fd(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define mo 998244353
#define N 410
int n,m;
LL f[N][N],a[N][N],b[N],ans;
struct node{int l,r;}p[N];
bool cmp(node x,node y){return x.l<y.l;}
LL mi(LL x,LL y){
if(y==1)return x;
return y&1?x*mi(x*x%mo,y/2)%mo:mi(x*x%mo,y/2);
}
int in(int x,int y){return p[y].l<=x&&x<=p[y].r;}
int main(){
scanf("%d%d",&n,&m);
F(i,1,m)scanf("%d%d",&p[i].l,&p[i].r);
F(i,1,n) F(j,1,n) F(k,1,m)if(in(i,k)&&in(j,k))a[i][j]++;
F(i,1,n) F(j,1,m)if(in(i,j))b[i]++;
f[0][0]=-1;
F(i,1,n) F(j,0,i-1) F(k,0,m)(f[i][k-a[i][j]+b[i]]+=mo-f[j][k])%=mo;
F(i,1,n) F(j,0,m)(ans+=f[i][j]*mi(j,mo-2)%mo*m%mo)%=mo;
printf("%lld",ans);
return 0;
}