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 ...
随机推荐
- AD预测论文研读系列1
A Deep Learning Model to Predict a Diagnosis of Alzheimer Disease by Using 18F-FDG PET of the Brain ...
- 基于xlua和mvvm的unity框架
1.框架简介 这两天在Github上发现了xlua的作者车雄生前辈开源的一个框架—XUUI,于是下载下来学习了一下.XUUI基于xlua,又借鉴了mvvm的设计概念.xlua是目前很火的unity热更 ...
- shell的编程结构体(函数、条件结构、循环结构)
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 shell函数 在shell中,函数可以被当作命令一样 ...
- [转]Angular2-组件间数据传递的两种方式
本文转自:https://www.cnblogs.com/longhx/p/6960288.html Angular2组件间数据传递有多种方式,其中最常用的有两种,一种是配置元数据(或者标签装饰),一 ...
- 如何调试Javascript代码以及网页代码
做过网页开发的都知道,不过你是用php还是asp.net以及java开发的网站,在开发过程中,web网页展示页面肯定会出现或多或少的问题.这里我推荐使用谷歌浏览器进行Web网页的调试以及错误信息定位. ...
- Nullable<System.DateTime>日期格式转换 (转载)
一.问题 1.html页面中时间显示出错,数据库中时间是正确的. 原因:没有把DateTime转成String类型. 2. 在C#中,发现不能直接使用ToString("yyyy-MM-d ...
- [PHP]算法-归并排序的PHP实现
<?php //归并排序 function merge(&$A,$left,$mid,$right,$temp){ //7.左堆起始 $i=$left; //8.右堆起始 $j=$mid ...
- 两个inline-block消除间距和对齐(vertical-align)
一.神奇的两个inline-block 很初级的问题,无聊决定写一个故事. 故事的主人公很简单,两个inline-block元素.代码如下,为了看起来简单明了,写得很简陋.效果图如右.发现有两个问题. ...
- thinkphp去掉url中的.html后缀
- python之正则表达式及RE模块
正则表达式(匹配字符串)web界面正则匹配工具:http://tool.chinaz.com/regex/ 元字符 1 . 匹配除换行符之外的任意字符 2 \w 匹配数字字母下划线 3 \d 匹配数字 ...