【UOJ#390】【UNR#3】百鸽笼(动态规划,容斥)

题面

UOJ

题解

发现这就是题解里说的:“火山喷发概率问题”(大雾

考虑如果是暴力的话,你需要记录下当前每一个位置的鸽笼数量,因为概率会随着你空的鸽笼的数量而变化。

我们可以把这个问题转变为给一个长度为\(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】百鸽笼(动态规划,容斥)的更多相关文章

  1. 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学

    [BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...

  2. UOJ #390. 【UNR #3】百鸽笼

    UOJ #390. [UNR #3]百鸽笼 题目链接 看这道题之前先看一道相似的题目 [PKUWC2018]猎人杀. 考虑类似的容斥: 我们不妨设处理\(1\)的概率. 我们令集合\(T\)中的所有鸽 ...

  3. 【BZOJ4455】小星星(动态规划,容斥)

    [BZOJ4455]小星星(动态规划,容斥) 题面 BZOJ 洛谷 Uoj 题解 题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一 ...

  4. 【BZOJ5287】[HNOI2018]毒瘤(动态规划,容斥)

    [BZOJ5287][HNOI2018]毒瘤(动态规划,容斥) 题面 BZOJ 洛谷 题解 考场上想到的暴力做法是容斥: 因为\(m-n\le 10\),所以最多会多出来\(11\)条非树边. 如果就 ...

  5. 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)

    [LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...

  6. 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

    [UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...

  7. 【BZOJ2024】舞会(动态规划,容斥,高精度)

    [BZOJ2024]舞会(动态规划,容斥,高精度) 题面 BZOJ 洛谷 题解 这种关系显然要先排序才不会不想影响. 设\(f[i][j]\)表示前\(i\)个女生中,选了\(j\)个女生配对,并且女 ...

  8. 【BZOJ2839】集合计数(容斥,动态规划)

    [BZOJ2839]集合计数(容斥,动态规划) 题面 BZOJ 权限题 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使 ...

  9. 【BZOJ3622】已经没有什么好害怕的了(动态规划,容斥)

    [BZOJ3622]已经没有什么好害怕的了(动态规划,容斥) 题面 BZOJ 题解 很明显的,这类问题是要从至少变成恰好的过程,直接容斥即可. 首先我们要求的是(糖果>药片)=(药片>糖果 ...

随机推荐

  1. Redis for OPS 04:主从复制

    写在前面的话 Redis 的主从其实和 MySQL 类似,更多的还是作为备份的功能存在,在复杂的 Rediis 集群架构中,主从也是不可或缺的. 主从复制 主从复制原理: 1. 从库通过命令连接到主库 ...

  2. 在dubbo的一端,看Netty处理数据包,揭网络传输原理

    如今,我们想要开发一个网络应用,那是相当地方便.不过就是引入一个框架,然后设置些参数,然后写写业务代码就搞定了. 写业务代码自然很重要,但是你知道: 你的数据是怎么来的吗?通过网络传输过来的呗. 你知 ...

  3. java高并发系列 - 第8天:线程组

    线程组 我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树形结构,如下图: 使用线程组可以方便管理线程,线程组提供了一些方法方便方便我们管理线程. ...

  4. 2018-12-25-win10-uwp-通知列表

    原文:2018-12-25-win10-uwp-通知列表 title author date CreateTime categories win10 uwp 通知列表 lindexi 2018-12- ...

  5. .Net与其他公司接口对接心得

    第一次搞这玩意,心里有点紧张,万事开头难,第一次搞过之后,以后就容易了,所以将这次经历记录下来. 这里我们暂且把对接的公司叫A吧,A公司会提供一个接口对接说明,下面是A公司提供的接口说明 请求内容说明 ...

  6. CSS元素显示模式

    CSS的元素显示模式 什么是元素显示模式 作用:网页的标签非常多,在不同的地方会用到不同类型的标签,了解他们的特点可以更好的布局我们的网页 元素的显示模式就是元素(标签)以什么样的方式进行显示,比如& ...

  7. ES6入门系列 ----- 使用Proxy 实现观察者模式

    观察者模式是指函数自动观察数据对象的变化, 一旦对象有变化,函数就会自动执行. 它定义了一种一对多的依赖关系,我们用Proxy来实现一个简单的观察者模式(PS: 初学我们认为 观察者模式 == 发布订 ...

  8. Android开发总体布局

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  9. [20191012]使用bash从sql_id计算hash_value.txt

    [20191012]使用bash从sql_id计算hash_value.txt --//没有什么实际意义,仅仅验证方法是否可行.--//sql_id的计算是使用MD5算法进行哈希,生成一个128位的H ...

  10. DOS(磁盘操作系统)基本命令-思维导图