题目大意:在UOJ管理员群里一共有\(N\)个管理员,为了容纳这些管理员,vfk准备了\(N+1\)个鸽笼。

为了节省空间,vfk把这些鸽笼堆了起来,共有\(n\)列,第i列放了\(a_i\)个鸽笼,满足 \(\sum a_i=N+1\)。

每当UR结束,管理员们就会按照编号从小到大的顺序回到鸽笼里,每个管理员回来的时候,会先等概率的在所有还有剩余的鸽笼的列中随机一个列,然后住到这列剩下的鸽笼里编号最小的一个中。

现在\(N\)个管理员都回笼了之后,还有一列会空出一个鸽笼。你能对于每一列,求出这一列有空鸽笼的概率吗?

\(a_i \le 30, N\le 30\)

跟PKUWC2018猎人杀很像。

不必要的一步,问题可以转化为无限选直到只剩一个\(a_i>0\)

对于每个点,枚举一个集合\(S\),算出这个点在这个集合\(S\)所有点之前被删完的概率。显然集合外的操作我们可以忽略。

考虑这个点被选完的时候的操作序列,这个东西可以用一个背包做出来。于是有一个\(2^n * somthing\)的复杂度的东西。我们再加一维表示当前的集合大小,就行了。

瞎写一发,发现复杂度达到了\(O(n^4m^2)\),T了。我们把那个背包做完然后撤销就行了。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
inline int add(int a,int b){a+=b;return a>=mod?a-mod:a;}
inline int sub(int a,int b){a-=b;return a<0?a+mod:a;}
inline int mul(int a,int b){return (ll)a*b%mod;}
inline int qpow(int a,int b){int ret=1;for(;b;b>>=1,a=mul(a,a))if(b&1)ret=mul(ret,a);return ret;}
inline int inv(int x){return qpow(x,mod-2);}
/* math */
const int N = 40, SZ = 910;
int n,a[N];
int binom[2010][2010];
inline void preset(int n=2000){binom[0][0]=1;for(int i=1;i<=n;i++){binom[i][0]=binom[i][i]=1;for(int j=1;j<i;j++)binom[i][j]=add(binom[i-1][j-1],binom[i-1][j]);}
}
int f[N][SZ];
int g[N][SZ];int sum = 0;
inline void package(int sz){for(int i=1;i<=n;i++){for(int j=0;j<=sum;++j){g[i][j]=f[i][j];for(int d=0;d<sz&&j-d>=0;d++){g[i][j]=add(g[i][j],mul(f[i-1][j-d],binom[j][d]));}}}for(int i=1;i<=n;i++){for(int j=0;j<=sum;++j){f[i][j]=g[i][j];}}
}inline void unpackage(int sz){for(int i=1;i<=n;i++){for(int j=0;j<=sum;++j){g[i][j]=f[i][j];for(int d=0;d<sz&&j-d>=0;d++){g[i][j]=sub(g[i][j],mul(f[i-1][j-d],binom[j][d]));}f[i][j]=g[i][j];}}
}int main()
{preset();cin >> n;for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum+=a[i];f[0][0]=1;for(int i=1;i<=n;i++)package(a[i]);for(int i=1;i<=n;i++){unpackage(a[i]);int ans=0;for(int S=1;S<=n;++S){for(int len=0;len<=sum;++len){int totlen = len+a[i], way = mul(f[S-1][len], binom[len+a[i]-1][a[i]-1]);int p=qpow(inv(S),totlen);if(S&1) ans=add(ans, mul(p,way));else ans=sub(ans, mul(p,way));}}package(a[i]);printf("%d ",ans);}puts("");
}

转载于:https://www.cnblogs.com/weiyanpeng/p/11116186.html

UNR #3 百鸽笼相关推荐

  1. [UNR #3]百鸽笼

    百鸽笼 题解 首先,我们依然可以像上道题一样进行类似的转化. 每次操作时会随机一个使它减小111,我们的目的是当所有数都减到⩽0\leqslant 0⩽0,统计每个数时最后一个见得概率. 我们不妨去尝 ...

  2. [uoj390][UNR #3]百鸽笼【dp】【容斥原理】

    [题目链接] http://uoj.ac/problem/390 [题解] 考虑容斥原理,计算第 i i i列的时候,可以强制一些列在它之后被选取完,其他的列就不用处理了. 那么直到i" r ...

  3. UOJ #390 【UNR #3】百鸽笼 容斥+DP

    题目分析 算法0 每个管理员选哪一列,将构成一个长度为 N − 1 N-1 N−1的序列,序列的种数可以通过经典的将 a a a个相同元素插入到一个没有该元素的长度为 b b b的序列里问题,轻松求出 ...

  4. 【UOJ #390】【UNR #3】百鸽笼(指数型生成函数,二项式定理)

    题面

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

    Description 给定 n n n个正整数 a i a_i ai​,令 N + 1 = ∑ a i N+1=\sum a_i N+1=∑ai​ 将执行 N N N次操作,每次等概率随机选择一个非 ...

  6. JZOJ 5933. 【NOIP2018模拟10.27】百鸽笼

    Description Input 从文件 pigeon.in 中读入数据. 输入第一行包含两个正整数 n, m ,分别表示初始鸽笼数与操作个数. 第二行包含 n 个正整数,第 i 个数表示从左往右第 ...

  7. 【JZOJ A组】百鸽笼

    Description Input 从文件 pigeon.in 中读入数据. 输入第一行包含两个正整数 n, m ,分别表示初始鸽笼数与操作个数. 第二行包含 n 个正整数,第 i 个数表示从左往右第 ...

  8. NOIP前的刷题记录

    因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数   组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...

  9. 组合数学学习笔记(未完待续

    这学期学了不少组合数学,期末给他补完. 算法竞赛考得很多的部分啊 这个还是很重要的 在目前的算法竞赛中有三大计数考点 1)组合计数 2)线性计数 3)群论计数 其中群论计数比较困难,我又不知道什么是线 ...

最新文章

  1. face alignment by 3000 fps系列学习总结(三)
  2. JDK 9 @不建议使用的注释增强功能
  3. Android商城开发系列(二)——App启动欢迎页面制作
  4. 开源搜索引擎solr4.0+tomcat7实现中文分词
  5. Docker搭建SonarQube代码质量检查平台
  6. raspberry pi_如何使用Raspberry Pi测量颗粒物
  7. 用Prettier和ESlint来统一提交代码
  8. Linux scp连接很慢,ssh连接很慢问题分析
  9. Vivado下使用Microblaze控制LED(vcu118,HLS级开发)
  10. 联想微型计算机驱动,联想XM2061驱动
  11. 计算机职业学校教学论文,中等职业学校计算机教学论文
  12. python实现易校园自动打卡教程
  13. 欢迎体验 | Android 12 开发者预览版 3
  14. MA、BMA、PPP网络类型实验
  15. 零基础如何学习计算机语言
  16. 鼎捷t100架构_新合发集团借助鼎捷T100信息化全面升级!
  17. 金融科技B端市场群雄争霸 PATH四家各出奇招
  18. 【战国策】之《齐策·张仪为秦连横说齐王曰》
  19. python | 自动化exe程序
  20. 新年伊始,25岁“天才少年”曹原再发一篇Nature!9个月的第三篇Nature!

热门文章

  1. Homebrew简介及安装
  2. 2022年全球高净值人士净流入前十国家阿联酋居首;京沪跻身全球百万富翁最多城市前十;美中印亿万富翁数量全球前三 | 美通社头条...
  3. php解析微信接口,php微信公众平台交互与接口详解
  4. android中实现毛笔效果(View 中画图)
  5. window命令行 linux,Windows命令行:起源 直到引入Windows下的linux子系统(WSL)
  6. 隐形数字水印_轻量级安卓水印框架,支持隐形数字水印 AndroidWM
  7. 天创速盈:如何成功打造爆单商品?
  8. 截止8月31日,2012年跑步总量满1000公里
  9. screen运行mysql_使用screen管理远程会话
  10. 计算机软件系统崩溃,为什么我的电脑WIN7系统老是这个程序会崩溃