题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=4665

题解:

容斥,dp
令 v[i] 表示原来拥有i类糖果的人数
(一个套路,首先把每个糖果看成互不相同的,(最后再来除以 v[i]!,把同种糖果看成相同的) )
定义 dp[i][j]表示前i类糖果,有j个人的糖果和原来的一样,其他 N-j 个人暂时不拿糖果的方案数。
这个的转移如下:
对于已经确定的 i,j,枚举一个 k表示原来拥有的是第i类糖果的k个人任然拿到的是第i类糖果。
${dp[i][j]=dp[i-1][j-k]}\times{{C}_{v[i]}^{k}}\times{v[i]}\times{(v[i]-1)}\times{…}\times{(v[i]-k+1)}$
式子后面乘的东西意思是那k个人在第i类糖果中的选择方法数(每个糖果看成不一样的了)
然后就再把每一个 dp[N][i] * (N-i)! 表示剩下的人就随便选择糖果。
此时 dp[N][i]的含义即为:重新分配糖果后,至少有 i个人拿到了原来的那类糖果的方法数。
然后就是考虑容斥,答案 ANS=dp[N][0]-dp[N][1]+dp[N][2]-dp[N][3]......
最后还要把同类糖果看成相同的东西,即 ANS/=v[i]。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 2500
#define _ %mod
#define filein(x) freopen(#x".in","r",stdin)
#define fileout(x) freopen(#x".out","w",stdout)
using namespace std;
const int mod=1000000009;
int v[MAXN],dp[MAXN][MAXN],C[MAXN][MAXN],fac[MAXN],inv[MAXN];
int N,ANS;
int pow(int a,int b){
int now=1;
while(b){
if(b&1) now=(1ll*now*a)_;
a=(1ll*a*a)_; b>>=1;
}
return now;
}
int main()
{
scanf("%d",&N);
fac[0]=inv[0]=1;
for(int i=1;i<=N;i++) fac[i]=(1ll*fac[i-1]*i)_;
inv[N]=pow(fac[N],mod-2);
for(int i=N-1;i>=1;i--) inv[i]=(1ll*inv[i+1]*(i+1))_;
for(int i=0;i<=N;i++){
C[i][0]=1;
for(int j=1;j<=i;j++)
C[i][j]=(1ll*C[i-1][j-1]+C[i-1][j])_;
}
for(int i=1,x;i<=N;i++) scanf("%d",&x),v[x]++;
dp[0][0]=1;
for(int i=1;i<=N;i++)
for(int j=0;j<=N;j++)
for(int k=0;k<=v[i];k++){
if(k>j) break;
dp[i][j]=(1ll*dp[i][j]+1ll*dp[i-1][j-k]*C[v[i]][k]_*fac[v[i]]_*inv[v[i]-k])_;
}
for(int i=0;i<=N;i++){
dp[N][i]=1ll*dp[N][i]*fac[N-i]_;
if(i&1) dp[N][i]=(1ll*dp[N][i]*(-1)+mod)_;
ANS=(1ll*ANS+dp[N][i]+mod)_;
}
for(int i=1;i<=N;i++) ANS=1ll*ANS*inv[v[i]]_;
printf("%d",ANS);
return 0;
}

●BZOJ 4665 小w的喜糖的更多相关文章

  1. BZOJ 4665: 小w的喜糖

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

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

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

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

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

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

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

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

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

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

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

  7. 小w的喜糖(candy)

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

  8. BZOJ4665: 小w的喜糖 DP

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

  9. BZOJ4665 : 小w的喜糖

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

随机推荐

  1. 冲刺NO.2

    Alpha冲刺第二天 站立式会议 项目进展 团队成员在确定了所需技术之后,开始学习相关技术的使用,其中包括了HTML5,CSS与SSH框架等开发技术.并且在项目分工配合加以总结和完善,对现有发现的关于 ...

  2. 简单的C语言编译器--概述

      在学习了编译原理的相关知识后,逐渐的掌握一个编译器的结构.作用和实现方法.同时,希望自己在不断的努力下写出一个简单的C语言编译器. 实现步骤 词法分析器:将C语言测试代码分解成一个一个的词法单元: ...

  3. OSI七层协议模型、TCP/IP四层模型学习笔记

    1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...

  4. java利用iTextWorker生成pdf

    使用itext生成pdf,在linux环境下,中文全部失踪,因为itext要在linux下支持中文字体需要引入itext-asian, 并添加一个字体类. public static class Pd ...

  5. Unix下zfs文件系统重组RAID-5后可以这样恢复

    存储做的RAID-5, SCSI硬盘,操作系统是FreeBSD,文件系统是zfs.本案例共有12块硬盘,11块硬盘里有数据,1块硬盘是热备盘.其中第6块数据硬盘出现故障,重组时需要将其剔除. 物理盘: ...

  6. es6对象字面量增强

    相对于ES5,ES6的对象字面量得到了很大程度的增强.这些改进我们可以输入更少的代码同时语法更易于理解.那就一起来看看对象增强的功能.对象字面量简写(Object Literal Shorthand) ...

  7. 《javascript设计模式与开发实践》阅读笔记(10)—— 组合模式

    组合模式:一些子对象组成一个父对象,子对象本身也可能是由一些孙对象组成. 有点类似树形结构的意思,这里举一个包含命令模式的例子 var list=function(){ //创建接口对象的函数 ret ...

  8. JAVA_SE基础——64.StringBuffer类 ①

     字符串特点:字符串是常量:它们的值在创建之后不能更改 字符串的内容一旦发生了变化,那么马上会创建一个新的对象. 注意:字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象. publ ...

  9. php的api及登录的权限验证

    类,库,接口(APi),函数,这些概念都是根据问题规模的大小来界定的.一个很小的问题肯定没有必要写成一个库,只需要写几句话就行了. 但是比如一个登录验证,这个功能很强大,很通用,可能前台后台都需要用到 ...

  10. 解决忽略VScode中Python插件pylint报错的问题

    pylint是VScode中python自带的插件,可以帮助代码规范,美观. 但是有些报错是你不想看到的,你可以选择性的忽略. 例如,在re.compile()中,可以添加参数re.S使. 匹配任意字 ...