UOJ #390. 【UNR #3】百鸽笼
UOJ #390. 【UNR #3】百鸽笼
看这道题之前先看一道相似的题目 【PKUWC2018】猎人杀。
考虑类似的容斥:
我们不妨设处理\(1\)的概率。
我们令集合\(T\)中的所有鸽笼都在\(1\)变空之前不为空的,其它的鸽笼随便。要做到这一点,我们只需要令每个\(T\)集合中的鸽笼容量\(--\)就行了。然后我们用背包背出所有序列的方案数(不包括\(1\)),然后在将\(1\)插入序列中。插入时,将\(w_i-1\)个随便插入,然后再将一个放在序列末尾。
具体实现时,我们可以枚举"\(1\)",然后对其它的鸽笼进行背包。但是复杂度会达到\(O(n^6)\)。于是我们先对所有鸽笼进行背包,计算"\(1\)"的时候直接将它的贡献消除,也就是做"反背包"。复杂度就是\(O(n^5)\)。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 35
#define mod 998244353
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n,w[N];
ll ksm(ll t,ll x) {
ll ans=1;
for(;x;x>>=1,t=t*t%mod)
if(x&1) ans=ans*t%mod;
return ans;
}
ll fac[1005],inv[1005];
ll C(int n,int m) {
if(n<m) return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
ll f[N][N*N];
ll g[N][N*N];
int sum;
void solve(int now) {
memcpy(f,g,sizeof(f));
for(int i=1;i<=n;i++) {
for(int j=0;j<=sum;j++) {
for(int q=0;q<w[now]&&q<=j;q++) {
f[i][j]=(f[i][j]-f[i-1][j-q]*C(j,q)%mod+mod)%mod;
}
}
}
ll ans=0,flag=1;
for(int i=0;i<n;i++,flag*=-1) {
ll invi=ksm(i+1,mod-2),t=ksm(invi,w[now]);
for(int j=0;j<=sum;j++,t=t*invi%mod) {
if(!f[i][j]) continue ;
(ans+=flag*C(j+w[now]-1,w[now]-1)*f[i][j]%mod*t%mod)%=mod;
}
}
cout<<(ans+mod)%mod<<" ";
}
int main() {
fac[0]=1;
for(int i=1;i<=900;i++) fac[i]=fac[i-1]*i%mod;
inv[900]=ksm(fac[900],mod-2);
for(int i=899;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
n=Get();
for(int i=1;i<=n;i++) w[i]=Get();
g[0][0]=1;
for(int i=1;i<=n;i++) {
sum+=w[i]-1;
for(int j=i;j>=1;j--) {
for(int k=sum;k>=0;k--) {
for(int q=0;q<w[i]&&q<=k;q++) {
(g[j][k]+=g[j-1][k-q]*C(k,q))%=mod;
}
}
}
}
for(int i=1;i<=n;i++) solve(i);
return 0;
}
UOJ #390. 【UNR #3】百鸽笼的更多相关文章
- 【UOJ#390】【UNR#3】百鸽笼(动态规划,容斥)
[UOJ#390][UNR#3]百鸽笼(动态规划,容斥) 题面 UOJ 题解 发现这就是题解里说的:"火山喷发概率问题"(大雾 考虑如果是暴力的话,你需要记录下当前每一个位置的鸽笼 ...
- UOJ.311.[UNR#2]积劳成疾(DP)
UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\) ...
- uoj【UNR #3】To Do Tree 【贪心】
题目链接 uojUNR3B 题解 如果不输出方案,是有一个经典的三分做法的 但是要输出方案也是可以贪心的 设\(d[i]\)为\(i\)节点到最深的儿子的距离 贪心选择\(d[i]\)大的即可 #in ...
- UOJ.386.[UNR #3]鸽子固定器(贪心 链表)
题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...
- Noip模拟80 2021.10.18
预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...
- NOIP前的刷题记录
因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数 组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...
- NOIP模拟80
学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...
- 【UOJ#311】【UNR #2】积劳成疾(动态规划)
[UOJ#311][UNR #2]积劳成疾(动态规划) UOJ Solution 考虑最大值分治解决问题.每次枚举最大值所在的位置,强制不能跨过最大值,左右此时不会影响,可以分开考虑. 那么设\(f[ ...
- [FWT] UOJ #310. 【UNR #2】黎明前的巧克力
[uoj#310][UNR #2]黎明前的巧克力 FWT - GXZlegend - 博客园 f[i][xor],考虑优化暴力,暴力就是FWT xor一个多项式 整体处理 (以下FWT代表第一步) F ...
随机推荐
- 【NET CORE微服务一条龙应用】第二章 配置中心使用
背景 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 在分布式或者微服务系统里,通过配置文件来管理配置内容,是一件比较令人痛苦的事情,再谨慎也有湿鞋的时候,这就是在项目架构发展的过程中,配 ...
- python的Web框架,auth权限系统
使用django默认权限系统实现用户登录退出 判断用户是否登录 request.user.is_authenticated 返回的为bool值 一个简单的登录视图范式: # 导包 from djang ...
- [HEOI2017] 相逢是问候
Description 支持以下两个操作: 将第 \(l\) 个数到第 \(r\) 个数 \(a_l,a_{l+1},\dots a_r\) 中的每个数 \(a_i\) 替换为 \(c^{a_i}\) ...
- this引用逃逸
1.什么是This逃逸? 在构造器构造还未彻底完成前(即实例初始化阶段还未完成),将自身this引用向外抛出并被其他线程复制(访问)了该引用,可能会问到该还未被初始化的变量,甚至可能会造成更大严重的问 ...
- 部署DTCMS到Jexus遇到的问题及解决思路---部署
上一篇我们环境已经准备完成,此时可以部署了,我们就以dtcms作为例子,http://bbs.dtcms.net/forum.php?mod=viewthread&tid=2420&e ...
- 【Tomcat】压力测试和优化
一.采用jmeter进行测试 为什么使用jmeter, 它免费开源, 不断发展, 功能逐渐强大. 可以做功能,负载, 性能测试.一套脚本可以同时用于功能和性能测试.Jmeter 有着众多的插件开发者, ...
- 终端复用软件 tmux
Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权. Tmux 所使用的快捷键前缀默认是组合键 Ctrl-b(同时按下 Ctrl 键和 b 键). 技巧 ...
- demo:动态生成专属二维码
在日常生活中,随处可见二维码,那么js如何生成动态的专属二维码?其实,通过"二维码插件"我们可以快速生成二维码.在这,记录一下的生成专属二维码demo,一起来看看jquery.qr ...
- 活字格Web应用平台学习笔记 8 - 查询记录
基础教程只剩一点点了,学完算了. 这一课的目标是:查询记录 这个操作的原理很简单,增加一个表格,绑定“部门”那个数据,然后增加一个命令,点击查询. 绑定命令: 完成后的实际界面,查询前面是个下拉框: ...
- jquery获取标签名,获取id
var elementId = $(this).attr("id"); var tagName = $(this)[0].tagName;