我们先假设同种糖间存在差异。

设 \(f_{i,j}\) 表示前 \(i\) 种糖至少有 \(j\) 人拿到的糖和原来一样,\(c_i\) 表示拿第 \(i\) 种糖的人的个数,则有:

\[f_{i,j}=\sum_{k=0}^{\min(j,c_i)}f_{i-1,j-k}\binom{c_i}kc_i^\underline k
\]

设 \(g_i\) 表示所有人中恰好有 \(i\) 人拿到的糖和原来一样,根据二项式反演得:

\[g_i=\sum_{j=i}^n(-1)^{j-i}\binom jif_{m,j}
\]

发现所求即为 \(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的喜糖 题解的更多相关文章

  1. [bzoj4665]小w的喜糖_二项式反演

    小w的喜糖 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4665 数据范围:略. 题解: 二项式反演裸题. $f_{i,j}$表示,前$i$种钦 ...

  2. bzoj4665小w的喜糖 dp+容斥

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 120  Solved: 72[Submit][Status][Discuss] ...

  3. bzoj4665 小w的喜糖(dp+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 130[Submit][Status][Discuss ...

  4. BZOJ4665: 小w的喜糖 DP

    对于这道题,首先每个人的位置并不影响结果 所以我们可以将相同颜色糖果的人放在一块处理 设 $f_{i,j}$ 表示处理到第 $i$ 种糖果至少有 $j$ 人的糖果和原先的类型相同 枚举当前种类中不满足 ...

  5. BZOJ4665 : 小w的喜糖

    考虑枚举哪些人一定不合法,那么方案数可以通过简单的排列组合算出. 于是设$f[i][j]$表示前$i$种糖果,一共有$j$个人一定不合法的方案数,但是这样并不能保证其他人一定合法,所以需要进行容斥. ...

  6. 【BZOJ4665】小w的喜糖 容斥+组合数

    [BZOJ4665]小w的喜糖 Description 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那 ...

  7. 小w的喜糖(candy)

    小w的喜糖(candy) 题目描述 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每 ...

  8. 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜 ...

  9. ●BZOJ 4665 小w的喜糖

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4665 题解: 容斥,dp令 v[i] 表示原来拥有i类糖果的人数. (一个套路,首先把每个糖 ...

  10. BZOJ 4665: 小w的喜糖

    Sol DP+容斥. 这就是一个错排的扩展...可是想到容斥却仅限于种数的容斥,如果种数在一定范围内我就会做了QAQ. 但是容斥的是一定在原来位置的个数. 发现他与原来的位置无关,可以先把每个同种的糖 ...

随机推荐

  1. S2P主数据助力医药企业建立数据化管理平台

    随着国家信息化进程的推进,医药软件行业市场规模正在不断扩大,其应用领域也在逐步拓宽,企业面临着多样化的销售渠道和模式选择.然而,要想在这样的多变市场中占据优势地位,单纯依靠经验决策已经不足以应对挑战. ...

  2. 【C#基础】Dynamic类型和正确用法

    前言 Dynamic类型是C#4.0中引入的新类型,它允许其操作掠过编译器类型检查,而在运行时处理. 编程语言有时可以划分为静态类型化语言和动态类型化语言.C#和Java经常被认为是静态化类型的语言, ...

  3. 高效文件处理:Python pathlib实战指南

    在使用Python处理文件路径时,强烈建议使用pathlib. pathlib以面向对象的方式处理文件路径,既避免了很多陷阱,也能使执行许多路径的相关操作变得更容易. 本篇总结了常用的使用pathli ...

  4. ksmbd 条件竞争漏洞挖掘:思路与案例

    ksmbd 条件竞争漏洞挖掘:思路与案例 ksmbd 条件竞争漏洞挖掘:思路与案例.drawio 本文介绍从代码审计的角度分析.挖掘条件竞争.UAF 漏洞思路,并以 ksmbd 为实例介绍审计的过程和 ...

  5. 【转载】 SpringBoot声明式事务的简单运用

    https://blog.csdn.net/justry_deng/article/details/80828180 关于事物的基本概念等这里就不介绍了. Spring声明式事物的实现,有两种方式:第 ...

  6. 还在手工写接口测试文档,已经out了

    接口文档,顾名思义就是对接口说明的文档.好的接口文档包含了对接口URL,参数以及输出内容的说明,我们参照接口文档就能编写出一个个的测试用例.而且接口文档详细的话,测试用例编写起来就会比较简单,不容易遗 ...

  7. mongodb和spring集成中MongoTemplate的总结是使用方法

    基础实体类@Document(collection="person") class Person{ String id; String name; int age; public ...

  8. Qt编写4K/8K大分辨率播放器(8K占用1%CPU)

    一.前言 在经过多种内核的洗礼以后,逐渐对不同内核的不同音视频文件和视频流进行大量的对比测试,比如测试对各种格式的支持性,对各种网络流的支持程度,在同一个地址下占用的CPU/GPU资源比对,最终发现播 ...

  9. Qt编写可视化大屏电子看板系统30-模块8物料管理

    一.前言 物料管理模块包括库存占比.主要零件库存状况子模块,其中库存占比采用自定义控件环形进度条展示,总共有多种库存,具体根据数据库中的名称展示不同的界面,当库存数不够的时候,对应环形进度条颜色红色显 ...

  10. 视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术

    本文由陆业聪分享,原题"一文掌握直播技术:实时音视频采集.编码.传输与播放",本文进行了排版和内容优化. 1.引言 从游戏.教育.电商到娱乐,直播技术的应用场景无处不在.随着移动端 ...