博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UOJ #390. 【UNR #3】百鸽笼
阅读量:6911 次
发布时间:2019-06-27

本文共 1268 字,大约阅读时间需要 4 分钟。

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

看这道题之前先看一道相似的题目 。

考虑类似的容斥:

我们不妨设处理\(1\)的概率。

我们令集合\(T\)中的所有鸽笼都在\(1\)变空之前不为空的,其它的鸽笼随便。要做到这一点,我们只需要令每个\(T\)集合中的鸽笼容量\(--\)就行了。然后我们用背包背出所有序列的方案数(不包括\(1\)),然后在将\(1\)插入序列中。插入时,将\(w_i-1\)个随便插入,然后再将一个放在序列末尾。

具体实现时,我们可以枚举"\(1\)",然后对其它的鸽笼进行背包。但是复杂度会达到\(O(n^6)\)。于是我们先对所有鸽笼进行背包,计算"\(1\)"的时候直接将它的贡献消除,也就是做"反背包"。复杂度就是\(O(n^5)\)

代码:

#include
#define ll long long#define N 35#define mod 998244353using 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
=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
<=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;}

转载于:https://www.cnblogs.com/hchhch233/p/10159901.html

你可能感兴趣的文章
10.fabric-java-sdk使用联接池后长时间,报UNAVAILABLE问题处理
查看>>
Tomcat的负载均衡(apache的mod_jk来实现)
查看>>
Win8上iis配置
查看>>
Confluence 6 配置 Office 转换器
查看>>
Spring中属性文件properties的读取与使用
查看>>
vShield保护虚拟化环境一例
查看>>
kettle对phoenix操作
查看>>
云计算与虚拟化概述-你不得不知的云计算与虚拟化基础知识
查看>>
在VMmware中安装CentOs 6.6,kdump启动失败的原因
查看>>
iOS各种绘图代码整合
查看>>
Lambda表达式-Stream简介
查看>>
Web开发技术--oscache教程
查看>>
C# 将类的内容写成JSON格式的字符串
查看>>
Android SqliteManager 源码
查看>>
iSCSI, FC和FCoE的比较和适用场景
查看>>
MySQL - 学习入门
查看>>
UICC开机初始化
查看>>
IT从业人员关注哪些问题
查看>>
Windows 2012 Hyper –V 3.0 New Functions
查看>>
runC源码分析——namespace
查看>>