【题目链接】
  http://uoj.ac/problem/390
【题解】
  考虑容斥原理,计算第 i i i列的时候,可以强制一些列在它之后被选取完,其他的列就不用处理了。
那么直到i" role="presentation" style="position: relative;">iii取完为止,只考虑我们强制选的列,一定有 ai a i a_{i}个 i i i,其他强制的列j" role="presentation" style="position: relative;">jjj都小于 aj a j a_{j}个,且这个序列以 i i i结尾。由于没有任何一个列被提前取完,那么每一个这样的序列的出现概率都是相同的,为(1m+1)L" role="presentation" style="position: relative;">(1m+1)L(1m+1)L(\frac{1}{m+1})^L其中 L L L为序列的长度,m" role="presentation" style="position: relative;">mmm为强制选取的列的数量。
  那么接下来就可以通过背包dp来转移了,对于每一列我们分别做一次dp,记 fi,j,k f i , j , k f_{i,j,k}表示考虑了其他 i i i列,强制选取了j" role="presentation" style="position: relative;">jjj列,序列长度为 k k k的出现概率。转移十分显然。最后的答案就是∑j为偶数fn,j,k∗(1j+1)k−∑j为奇数fn,j,k∗(1j+1)k" role="presentation" style="position: relative;">∑j为偶数fn,j,k∗(1j+1)k−∑j为奇数fn,j,k∗(1j+1)k∑j为偶数fn,j,k∗(1j+1)k−∑j为奇数fn,j,k∗(1j+1)k\sum_{j为偶数}f_{n,j,k}*(\frac{1}{j+1})^k-\sum_{j为奇数}f_{n,j,k}*(\frac{1}{j+1})^k
  时间复杂度 O(N6) O ( N 6 ) O(N^6)
【代码】

# include<bits/stdc++.h>
# define  N     31
using namespace std;
const int P = 998244353;
int a[N], n, f[2][N][N  * N], ans[N], inv[N * N], mul[N * N];
int power(int x, int y){int i = x; x = 1;while (y > 0){if (y % 2 == 1) x = 1ll * i * x % P;i = 1ll * i * i % P;y /= 2;}return x;
}
int main(){scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);int sum = 0; for (int i = 1; i <= n; i++) sum = sum + a[i];mul[0] = 1; for (int i = 1; i <= sum; i++) mul[i] = 1ll * mul[i - 1] * i % P;inv[sum] = power(mul[sum], P - 2);for (int i = sum - 1; i >= 0; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % P;for (int t = 1; t <= n; t++){if (a[t] == 0) continue;int f1 = 0, f2 = 1;memset(f, 0, sizeof(f));    f[f1][0][a[t]] = inv[a[t] - 1];int now = a[t];for (int i = 1; i <= n; i++){if (i == t || a[i] == 0) continue;for (int j = 0; j <= n; j++)for (int k = 0; k <= now; k++)f[f2][j][k] = f[f1][j][k];for (int j = 0; j <= n; j++)for (int k = 0; k <= now; k++){if (f[f1][j][k] == 0) continue;for (int cnt = 0; cnt < a[i]; cnt++)f[f2][j + 1][k + cnt] = (f[f2][j + 1][k + cnt] + 1ll * f[f1][j][k] * inv[cnt]) % P;}swap(f1, f2);now = now + a[i] - 1;}for (int j = 0; j <= n; j++)for (int k = 1; k <= sum; k++){int num = power(power(j + 1, k), P - 2);if (j % 2 == 0) ans[t] = (ans[t] + 1ll * num * f[f1][j][k] % P * mul[k - 1]) % P; else ans[t] = (ans[t] - 1ll * num * f[f1][j][k] % P * mul[k - 1]) % P; }}for (int i = 1; i <= n; i++)printf("%d%c", (ans[i] + P) % P, (i == n) ? '\n' : ' ');
}

[uoj390][UNR #3]百鸽笼【dp】【容斥原理】相关推荐

  1. [UNR #3]百鸽笼

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

  2. UNR #3 百鸽笼

    题目大意:在UOJ管理员群里一共有\(N\)个管理员,为了容纳这些管理员,vfk准备了\(N+1\)个鸽笼. 为了节省空间,vfk把这些鸽笼堆了起来,共有\(n\)列,第i列放了\(a_i\)个鸽笼, ...

  3. 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理

    题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...

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

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

  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. 【UOJ #390】【UNR #3】百鸽笼(指数型生成函数,二项式定理)

    题面

  7. 【BZOJ-2669】局部极小值 状压DP + 容斥原理

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 561  Solved: 293 [Submit][Stat ...

  8. 【bzoj 4455】小星星(树型DP+容斥原理+dfs建树和计算的2种方式)

    题意:给一个n个点的图和一个n个点的树,求图和树上的点一一对应的方案数.(N<=17) 解法: 1.在树的结构上进行tree DP,f[i][j]表示树上点 i 对应图上点 j 时,这个点所在子 ...

  9. wyh的考核(dp/容斥原理)

    链接:https://ac.nowcoder.com/acm/problem/15442 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

最新文章

  1. [转][小结][三种方法]实现WPF不规则窗体
  2. SQLAlchemy的使用---外键ForeignKey数据库创建与连接
  3. 6.4 JAVA 方法重载
  4. TypeScript class 的参数属性 parameter properties
  5. Exchange 2013学习(六),脱机通讯簿
  6. CSP-S集训刷题记录
  7. 近似装箱问题(两种脱机算法实现)
  8. win7远程多用户登录此计算机无法,win7如何实现远程桌面多用户登录|win7实现多用户登录远程桌面的方法...
  9. 戴尔便携式计算机无法开机,戴尔笔记本电脑开不了机如何解决【解决方法】
  10. 关于 mac m1 xcode12 编译报错 this target. for architecture arm64等问题解决方案
  11. 计算机网络日志查询,系统资源管理_百络网警内网管理软件_电脑配置统计,系统日志,日志查询...
  12. Pc-98 android,PC安卓多功能搞机助手3.98
  13. 2019年,瑞云渲染做了这些事……
  14. concurrency runtime学习笔记之二:并行
  15. 标注工具——Electron、HTML、CSSjs的学习笔记目录
  16. 老李分享云计算基本概念 2
  17. svn 图标不显示 window10
  18. 中国农业大学计算机考研拟录取名单,中国农业大学2021年硕士生招生考试拟录取名单公示...
  19. win10 安装sudo命令
  20. 操作系统接口之批处理作业

热门文章

  1. Nikto详细使用教程
  2. 为什么要学习汇编语言
  3. 史上最全的java spring注解,没有之一
  4. C语言求1-1/2+1/3-1/4+...+1/99-1/100的值,3种循环实现
  5. 供货紧张!苹果被曝 iPhone 12 电源芯片产能不足
  6. wordpress添加媒体_4种将音频添加到WordPress网站的简单方法
  7. 忍3服务器维护奖励,《忍者必须死3》重新开服补偿有哪些 重新开服补偿一览
  8. 两个scanf只运行了一个
  9. Misc_冰蝎流量分析
  10. 数字水印Java写_Java实现数字水印