【ABC242EX】Random Painting
【ABC242EX】Random Painting
by AmanoKumiko
Description
有个位置,个区间
每次会随机选出一个区间,并把区间的位置变成黑色(初始都为白色)
求把所有位置变成黑色的期望次数对取模的结果
Input
第一行读入
然后行读入区间
Output
一行一个数表示答案
Sample Input
3 3
1 1
1 2
2 3
Sample Output
499122180
Data Constraint
Solution
第一次用反演
令表示期望把整个集合染黑的次数
表示期望第一次染黑集合中任意位置的次数
那么接下来要做的就是设个
令表示集合最后一次选了位置,和集合有交的区间数为的容斥系数
枚举上一次选的位置和有交区间数,令其为
可以发现,我们的新区间数就是减去和都有交的,加上只和有交的
因为在之前选的和有交的区间也一定会在上面算到
再根据——从个元素中选出个元素中的任意一个元素的期望次数为就行了
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现