[BZOJ4665] 小w的喜糖 题解
我们先假设同种糖间存在差异。
设 \(f_{i,j}\) 表示前 \(i\) 种糖至少有 \(j\) 人拿到的糖和原来一样,\(c_i\) 表示拿第 \(i\) 种糖的人的个数,则有:
\]
设 \(g_i\) 表示所有人中恰好有 \(i\) 人拿到的糖和原来一样,根据二项式反演得:
\]
发现所求即为 \(g_0=\sum\limits_{j=0}^n(-1)^jf_{m,j}\),但是同种糖差异问题仍未解决。实际上同种糖间存在差异相当于给不存在差异的情况 \(\times\prod c_i!\),给 \(g_0\) 除掉就可以了。
时间复杂度 \(O(n^2)\)。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2005,p=1e9+9;
int n,sum,c[N],f[N][N],jc[N],inv[N];
int qpow(int x,int y){
int re=1;
while(y){
if(y&1) re=re*x%p;
x=x*x%p,y>>=1;
}return re;
}int C(int x,int y){
return jc[x]*inv[y]%p*inv[x-y]%p;
}int A(int x,int y){
return jc[x]*inv[x-y]%p;
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n,jc[0]=inv[0]=1;
for(int i=1,x;i<=n;i++) cin>>x,c[x]++;
for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%p;
inv[n]=qpow(jc[n],p-2),f[0][0]=1;
for(int i=n-1;i;i--) inv[i]=inv[i+1]*(i+1)%p;
for(int i=1,sum=c[1];i<=n;i++,sum+=c[i])
for(int j=0;j<=c[i];j++) for(int k=j;k<=sum;k++)
f[i][k]=(f[i][k]+f[i-1][k-j]*C(c[i],j)%p*A(c[i],j))%p;
for(int i=0;i<=n;i++)
sum=(sum+(1-i%2*2)*f[n][i]*jc[n-i])%p;
for(int i=1;i<=n;i++)
sum=sum*inv[c[i]]%p;
cout<<(sum+p)%p;
return 0;
}
[BZOJ4665] 小w的喜糖 题解的更多相关文章
- [bzoj4665]小w的喜糖_二项式反演
小w的喜糖 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4665 数据范围:略. 题解: 二项式反演裸题. $f_{i,j}$表示,前$i$种钦 ...
- bzoj4665小w的喜糖 dp+容斥
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 120 Solved: 72[Submit][Status][Discuss] ...
- bzoj4665 小w的喜糖(dp+容斥)
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 222 Solved: 130[Submit][Status][Discuss ...
- BZOJ4665: 小w的喜糖 DP
对于这道题,首先每个人的位置并不影响结果 所以我们可以将相同颜色糖果的人放在一块处理 设 $f_{i,j}$ 表示处理到第 $i$ 种糖果至少有 $j$ 人的糖果和原先的类型相同 枚举当前种类中不满足 ...
- BZOJ4665 : 小w的喜糖
考虑枚举哪些人一定不合法,那么方案数可以通过简单的排列组合算出. 于是设$f[i][j]$表示前$i$种糖果,一共有$j$个人一定不合法的方案数,但是这样并不能保证其他人一定合法,所以需要进行容斥. ...
- 【BZOJ4665】小w的喜糖 容斥+组合数
[BZOJ4665]小w的喜糖 Description 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那 ...
- 小w的喜糖(candy)
小w的喜糖(candy) 题目描述 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每 ...
- 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 94 Solved: 53 Description 废话不多说,反正小w要发喜 ...
- ●BZOJ 4665 小w的喜糖
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4665 题解: 容斥,dp令 v[i] 表示原来拥有i类糖果的人数. (一个套路,首先把每个糖 ...
- BZOJ 4665: 小w的喜糖
Sol DP+容斥. 这就是一个错排的扩展...可是想到容斥却仅限于种数的容斥,如果种数在一定范围内我就会做了QAQ. 但是容斥的是一定在原来位置的个数. 发现他与原来的位置无关,可以先把每个同种的糖 ...
随机推荐
- 使用Docker快速部署一个Net项目
前言 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 优点 Web 应用的自动化打包和发布. 自动化测试和 ...
- 使用 Visual Studio 调试器附加到正在运行的进程
使用 Visual Studio 调试器附加到正在运行的进程 使用场景 当项目在测试环境上有bug,需要运行代码调试一下,这时就需要在测试环境上安装一个调试工具,然后在本地运行代码,远程链接到测试环境 ...
- PM-软件最难的不是开发程序,而是需求
最近几个月,关于人工智能的惊人文章在互联网泛滥.这也引发了很多人的担心--软件开发人员可能很快就会失业,被人工智能取代.他们想象所有的企业高管和产品研究人员将绕过大多数或所有的软件开发人员,直接要求人 ...
- 【sprinb-boot】@ComponentScan 跳过扫描 excludeFilters
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Contr ...
- 使用Spring提供的BeanUtils.copyProperties()方法报错:Could not copy property 'xxx' from source to target
使用Spring提供的BeanUtils.copyProperties()方法报错:Could not copy property 'xxx' from source to target; neste ...
- Qt/C++动态启用地图功能/地图拖曳/键盘操作/滚轮缩放/双击放大/连续缩放等
一.前言说明 地图组件为了方便用户的操作,一般会满足各种需求场景,比如用鼠标拖曳地图,实体键盘按键上下左右移动,鼠标滚轮缩放地图大小,双击放大地图,这些常规的操作可以极大的方便用户操作,问题是,有时候 ...
- 在线标定新思路!SST-Calib:最新Camera-Lidar时空同步标定算法(ITSC 2022)
在线标定新思路!SST-Calib:最新Camera-Lidar时空同步标定算法(ITSC 2022) 论文链接: 链接:https://pan.baidu.com/s/1qsfml4THs26Y7b ...
- 在已有的项目中使用vuiew ui库
官方提供了三种方式,但是我觉得在已有的项目中使用是比较常见的 我在刚开始使用的时候不知道如何使用,我希望这个对大家有点帮助,特此来记录下! 我用的是创建了一个uview插件的项目,然后把里面uview ...
- 零基础学习Modbus通信协议
大家好!我是付工. 2012年开始接触Modbus协议,至今已经有10多年了,从开始的懵懂,到后来的顿悟,再到现在的开悟,它始终岿然不动,变化的是我对它的认知和理解. 今天跟大家聊聊关于Modbus协 ...
- 题解:CF727F Polycarp's problems
link. 贪心做法. 本题贪心做法的实质就是用整数尽量多地抵消该整数后面的负数. 如果正着做,没有办法考虑全该数后面的所有负数,所以倒着做. 例如当前遍历到了 \(50\),此时序列如下: \[\d ...