【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

1N,M400

Solution

第一次用minmax反演

max表示期望把整个集合染黑的次数

min表示期望第一次染黑集合中任意位置的次数

那么接下来要做的就是设个dp

fi,j表示集合最后一次选了位置i,和集合有交的区间数为j的容斥系数

枚举上一次选的位置和有交区间数,令其为fx,y

可以发现,我们的新区间数就是y减去xi都有交的,加上只和i有交的

因为在i之前选的和x有交的区间也一定会在上面算到

再根据——从i个元素中选出j个元素中的任意一个元素的期望次数为ij就行了

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;
}
posted @   冰雾  阅读(179)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示