【UOJ#390】【UNR#3】百鸽笼(动态规划,容斥)
【UOJ#390】【UNR#3】百鸽笼(动态规划,容斥)
题面
题解
发现这就是题解里说的:“火山喷发概率问题”(大雾
考虑如果是暴力的话,你需要记录下当前每一个位置的鸽笼数量,因为概率会随着你空的鸽笼的数量而变化。
我们可以把这个问题转变为给一个长度为\(N\)的序列填数的问题。
直接算似乎不是很好算(因为直接算是要钦定在最后,那么其他的东西放满之后每个位置被选择的概率会被改变),我们把最后一个被填满的恰好是\(i\),变成至少有一个集合\(S\)在\(i\)后面被填满。
因为是容斥,其他集合怎么样是无所谓的,所以可以直接丢掉;而\(S\)集合都要在\(i\)后面被填满,所以\(i\)是第一个被填满的,而\(i\)被填满后后面的概率也无所谓,为\(1\),前面又没有减少可以填的数的个数,所以每次填的概率也是一样的。假设\(i\)用完之后的长度为\(L\),那么前面的概率就是\(\frac{1}{(|S|+1)^L}\)。
这样子我们枚举集合之后,枚举集合中一个元素的出现次数,再记录一下总长度什么的,就可以进行转移了。
继续发现上面这个容斥过程中,最终的贡献之和\(|S|\)以及\(L\)相关,所以考虑只记录这两个东西进行转移,就可以优化掉集合的枚举。
然后对于\(n\)个位置每个位置都要算一遍答案,这个很不优秀,发现算两个不同位置的时候只需要在当前背包把新位置的贡献给删掉,再把之前位置的贡献给加进来就好了。
这样子每次位置只会进入背包两次,出背包一次。
复杂度为\(O(n^5)\)。
#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 998244353
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,N,a[35],C[950][950],f[35][950],ipw[35][950];
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
void Insert(int n,int sum,int a)
{
for(int i=n-1;~i;--i)
for(int j=sum;~j;--j)
if(f[i][j])
for(int k=0;k<a;++k)
add(f[i+1][j+k],MOD-1ll*f[i][j]*C[j+k][k]%MOD);
}
void Del(int n,int sum,int a)
{
for(int i=0;i<n;++i)
for(int j=0;j<=sum-a;++j)
if(f[i][j])
for(int k=0;k<a;++k)
add(f[i+1][j+k],1ll*f[i][j]*C[j+k][k]%MOD);
}
int main()
{
n=read();
for(int i=1;i<=n;++i)N+=(a[i]=read());
for(int i=1;i<=n;++i)ipw[i][0]=1;
for(int i=1;i<=n;++i)
for(int j=1,inv=fpow(i,MOD-2);j<=N;++j)
ipw[i][j]=1ll*ipw[i][j-1]*inv%MOD;
for(int i=0;i<=N;++i)C[i][0]=1;
for(int i=1;i<=N;++i)
for(int j=1;j<=i;++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
f[0][0]=1;
for(int i=1,s=0;i<=n;++i)Insert(i,s,a[i]),s+=a[i];
for(int i=1;i<=n;++i)
{
Del(n,N,a[i]);
int ret=0;
for(int j=0;j<n;++j)
for(int k=0;k<=N-a[i];++k)
if(f[j][k])
add(ret,1ll*f[j][k]*ipw[j+1][k+a[i]]%MOD*C[k+a[i]-1][a[i]-1]%MOD);
printf("%d ",ret);
Insert(n,N-a[i],a[i]);
}
puts("");return 0;
}
【UOJ#390】【UNR#3】百鸽笼(动态规划,容斥)的更多相关文章
- 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学
[BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...
- UOJ #390. 【UNR #3】百鸽笼
UOJ #390. [UNR #3]百鸽笼 题目链接 看这道题之前先看一道相似的题目 [PKUWC2018]猎人杀. 考虑类似的容斥: 我们不妨设处理\(1\)的概率. 我们令集合\(T\)中的所有鸽 ...
- 【BZOJ4455】小星星(动态规划,容斥)
[BZOJ4455]小星星(动态规划,容斥) 题面 BZOJ 洛谷 Uoj 题解 题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一 ...
- 【BZOJ5287】[HNOI2018]毒瘤(动态规划,容斥)
[BZOJ5287][HNOI2018]毒瘤(动态规划,容斥) 题面 BZOJ 洛谷 题解 考场上想到的暴力做法是容斥: 因为\(m-n\le 10\),所以最多会多出来\(11\)条非树边. 如果就 ...
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- 【BZOJ2024】舞会(动态规划,容斥,高精度)
[BZOJ2024]舞会(动态规划,容斥,高精度) 题面 BZOJ 洛谷 题解 这种关系显然要先排序才不会不想影响. 设\(f[i][j]\)表示前\(i\)个女生中,选了\(j\)个女生配对,并且女 ...
- 【BZOJ2839】集合计数(容斥,动态规划)
[BZOJ2839]集合计数(容斥,动态规划) 题面 BZOJ 权限题 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使 ...
- 【BZOJ3622】已经没有什么好害怕的了(动态规划,容斥)
[BZOJ3622]已经没有什么好害怕的了(动态规划,容斥) 题面 BZOJ 题解 很明显的,这类问题是要从至少变成恰好的过程,直接容斥即可. 首先我们要求的是(糖果>药片)=(药片>糖果 ...
随机推荐
- 部署asp.net core Kestrel 支持https 使用openssl自签ssl证书
通过openssl生成证书 openssl req -newkey rsa:2048 -nodes -keyout my.key -x509 -days 365 -out my.cer openssl ...
- Elasticsearch 6.x版本全文检索学习之Search API
Elasticsearch 6.x版本全文检索学习之Search API. 1).Search API,实现对es中存储的数据进行查询分析,endpoind为_search,如下所示. 方式一.GET ...
- Javase之集合体系(2)之List及其子类ArrayList,LinkedList与Vector及其迭代器知识
集合体系之List及其子类ArrayList,LinkedList与Vector及其迭代器知识 List(接口) 特点:有序(存储与取出顺序相同),可重复 List子类特点: ArrayList: ...
- react网页版聊天|仿微信、微博web版|react+pc端仿微信实例
一.项目介绍 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+nodejs等技术混合开发的仿微信web端聊天室react ...
- katalon studio升级到6.3.3版本后如何生成测试报告
背景: katalon studio 6.3.0版本开始,默认不会生成测试报告,因此,原先自动化运行结果的邮件也就不会包含测试报告附件. 解决方法如下: 通过插件[basic reports]生成测试 ...
- SAP系统玩阴的?
SAP系统玩阴的? 近日和项目上的ABAP开发顾问一起弄一个自开发的报表.其中某个栏位的取值需要从批次主数据里抓取到供应商代码,然后根据供应商代码取到供应商名称等.为此笔者需要备功能说明书.在说明书里 ...
- Android 7.0新特性
还望支持个人博客站:http://www.enjoytoday.cn 由于google目前不是无法直接在国内访问,故此,对于android 开发平台的7.0新特性做个保存.也可供大家查阅.原文转自an ...
- PHP 自动加载
回顾 开始的时候, 如果想在一个php文件中使用其它文件的类或方法, 需要通过include/require方法将文件包含进来. 这种方法的缺点也很明显: 如果需要引入很多文件, 就需要很多的incl ...
- c# 第39节 抽象类、抽象方法
本节内容: 1:抽象类的说明 2:抽象类的实例 1:抽象类的说明 抽象类定义:方法前有abstract就称为抽象类.抽象方法,抽象方法不提供任何实际实现. 注意点1: 抽象方法必须在抽象类中声明: 不 ...
- python 2.7 操作mysql数据库 实例
create table msg(id int primary key auto_increment,title varchar(20),name varchar(60),content varcha ...