4665: 小w的喜糖

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 222  Solved: 130
[Submit][Status][Discuss]

Description

废话不多说,反正小w要发喜糖啦!!
小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类。这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每个人手中的糖的种类都与原来不同。
两个方案不同当且仅当,存在一个人,他手中的糖的种类在两个方案中不一样。

Input

第一行,一个整数n
接下来n行,每行一个整数,第i个整数Ai表示开始时第i个人手中的糖的种类
对于所有数据,1≤Ai≤k,k<=N,N<=2000

Output

一行,一个整数Ans,表示方案数模1000000009

Sample Input

6
1
1
2
2
3
3

Sample Output

10

首先我们把每颗糖(第i种糖有$A_i$个)都看成不同的(也就是同种糖的排列顺序不同也算进方案)

最后再$ans/=A_i!$,这样就可以忽略同种糖的问题

一般看到这种题,都是先套路地求至少有$i$个......的方案数,再用容斥求答案。本题也是如此

我们套路地设$f[i][j]$为前$i$种糖,至少$j$个人不合法的方案数

$f[i][j]=\sum_{k=0}^{min(j,A_i)}\ f[i-1][j-k]*C(A_i,k)*A_i!/(A_i-k)!$

对于每个$f[n][i]$,剩下的$n-i$个人可以随意分糖

所以最终方案数$F[i]=f[n][i]*(n-i)!$

但是肯定有重复算的鸭

所以搞搞容斥统计下就好辣

$ans=\sum_{i=0}^n(-1)^iF[i]$

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
#define N 2005
const ll P=1e9+;
int n,A[N];
ll f[N][N],inv[N],fac[N],ifac[N],ans;
void prep(){
inv[]=; fac[]=fac[]=ifac[]=ifac[]=;
for(ll i=;i<=n;++i){
inv[i]=(P-P/i)*inv[P%i]%P;
fac[i]=fac[i-]*i%P;
ifac[i]=ifac[i-]*inv[i]%P;
}
}
inline ll C(int a,int b){return fac[a]*ifac[b]%P*ifac[a-b]%P;}
int main(){
scanf("%d",&n); prep();
for(int i=,q;i<=n;++i) scanf("%d",&q),++A[q];
f[][]=;
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
for(int k=;k<=min(j,A[i]);++k)
f[i][j]=(f[i][j]+f[i-][j-k]*C(A[i],k)%P*fac[A[i]]%P*ifac[A[i]-k]%P)%P;
for(int i=;i<=n;++i) ans=((ans+1ll*((i&)?-:)*f[n][i]*fac[n-i]%P)%P+P)%P;
for(int i=;i<=n;++i) if(A[i]>) ans=ans*ifac[A[i]]%P;
printf("%lld",ans);
return ;
}

bzoj4665 小w的喜糖(dp+容斥)的更多相关文章

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

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

  2. BZOJ4665: 小w的喜糖 DP

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

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

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

  4. BZOJ4665 : 小w的喜糖

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

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

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

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

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

  7. BZOJ 4665: 小w的喜糖

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

  8. bzoj 3622 DP + 容斥

    LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...

  9. 小w的喜糖(candy)

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

随机推荐

  1. 4.29python

    题目: 代码:(?) list = input().split()list1 = []list2 = []for i in range(len(list)): if (i+1)%3 != 0 and ...

  2. Tengine+Lua+GraphicsMagick

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! 使用 Tengine+Lua+GraphicsMagick 实现图片自动裁剪缩放 需求 : 图片 ...

  3. Luogu4197 Peaks

    题目链接:洛谷 看到“只经过困难值小于等于$x$的路径”. 感觉有点眼熟. ow,就是[NOI2018]归程. 和那道题一样,可以直接建出Kruskal重构树,每次倍增寻找祖先中最上面的不大于$x$的 ...

  4. numpy(二)

    通用函数: np.add  加 np.subtract  减 np.multiply  乘 np.divide  除 np.floor_divide  地板乘除法,取商 np.power  指数运算  ...

  5. 在linux系统中出现u盘问题 的相关解决方法

    1.显示unknown filesystem type .exfat 可以通过该方法解决: 安装exfat-fuse: 在终端中以管理员身份运行 sudo apt-get install exfat- ...

  6. ADB——adb devices unauthorized

    我们只有在手机打开USB调试,并且允许电脑对其进行调试的前提下才可以用ADB进行自动化操作手机,如果出现unauthorized提示的话就是说明手机没有允许电脑对其调试 这个时候通常手机回弹出允许调试 ...

  7. 如何配置Bitbucket的ssh

    在bitbucket上使用https协议,经常会在提交代码的时候出错,让人很着急上火,但是用ssh就要方便很多.下面介绍一下设置ssh的方法:1.在终端中运行ssh-keygen.2.然后一路ente ...

  8. urlib库的使用

    urlib库实际上不是很常用,因为其api调用复杂,已被requests模块取代. 1.request发送请求 from urllib import request #默认指定的是get请求 #url ...

  9. mysql 获取昨天数据 utc时间

    # yzj邀请昨日数据 SELECT s.id, s.create_at, ch.id, ch.code AS channel, c.id , c.code AS custom, so.id, so. ...

  10. Java集合框架面试题目

    1.为什么Map接口不继承Collection 接口? Set是无序集合,并且不允许重复的元素 List是有序的集合,并且允许重复的元素 而Map是键值对 它被视为是键的set和值的set的组合 Ma ...