小w的喜糖(candy)

题目描述

废话不多说,反正小w要发喜糖啦!!

小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类。这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每个人手中的糖的种类都与原来不同。

两个方案不同当且仅当,存在一个人,他手中的糖的种类在两个方案中不一样。

输入

第一行,一个整数n。

接下来n行,每行一个整数,第i个整数Ai表示开始时第i个人手中的糖的种类。

输出

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

样例输入

6
1
1
2
2
3
3

样例输出

10

提示

【数据规模和约定】

对于所有数据,1≤Ai≤k。

数据点

n

k

约束

1

≤10

≤10

2

3

≤20

n

每个人的糖果种类都不一样

4

≤100

5

≤2000

6

7

≤200

3

8

9

10

11

≤n

12

13

14

15

≤2000

16

17

18

19

20

solution

背景(没用)

错排:求1~n的排列ai,满足ai!=i的个数

考虑令  表示 个数字任意放的方案数,

 表示 个数字都不放在自己位置上的方案数,通过枚举不在自己位置上的数字的个数容易得到

由二项式反演得到

注意到  ,这样我们就得到了他的通项公式,通过将 和组合数展开就可以得到更为简便的通项公式了

---------------某度

有重复元素的排列

好的,接下来才是正经的题解

令f[i][j]表示前i种糖,有j个人拿到了原来的糖的方案数

考虑算f[i][j]

也就是第i种糖,有k个人不合法

就这样啦

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 2005
#define mod 1000000009
using namespace std;
int n,cnt[maxn],t;
long long ans,ny[maxn],f[maxn][maxn],h[maxn];
long long work(long long k,long long num){
long long tmp=1;
while(num){
if(num&1)tmp=tmp*k;
k=k*k;k%=mod;tmp%=mod;num/=2;
}
return tmp;
}
long long C(int n,int m){
long long tmp=0;
tmp=(1LL*h[n]*ny[m]%mod)*ny[n-m];tmp%=mod;
return tmp;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&t);
cnt[t]++;
}
h[0]=1;ny[0]=1;
for(int i=1;i<=n;i++){
h[i]=(1LL*h[i-1]*i)%mod;
ny[i]=work(h[i],mod-2);
}
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=n;j++){
for(int k=0;k<=cnt[i];k++){
if (k>j)break;
f[i][j]+=(1LL*f[i-1][j-k]*C(cnt[i],k))%mod*ny[cnt[i]-k];
f[i][j]%=mod;
}
}
int op=1;
for(int i=0;i<=n;i++){
ans+=(1LL*f[n][i]*(h[n-i]*op))%mod;
op=op*(-1);
}
ans=(ans%mod+mod)%mod;
cout<<ans<<endl;
return 0;
}

小w的喜糖(candy)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 4665: 小w的喜糖

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

  7. ●BZOJ 4665 小w的喜糖

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

  8. BZOJ4665: 小w的喜糖 DP

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

  9. BZOJ4665 : 小w的喜糖

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

随机推荐

  1. samba性能调优,调优后,性能增加30%

    global中增加下面内容. [global]    use sendfile = yes    write raw = yes    read raw = yes    max xmit = 655 ...

  2. python生成随机数

    import random rnd=rand.uniform(0,10)

  3. win10搭建FTP服务器

    下面就给大家讲解Win10搭建FTP服务器的详细操作方法. 1.首先,我们在Cortana中搜索控制面板并进入: 2.在控制面板-程序中,点击启用或关闭Windows功能: 3.在FTP服务器.Web ...

  4. 1452: [JSOI2009]Count

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 3135  Solved: 1828[Submit][Status][Discuss] Descripti ...

  5. PAT 乙级 1078 / 1084

    题目 PAT 乙级 1078 PAT 乙级 1084 题解 1078和1084这两道题放在一块写,主要是因为这两道题的解法和做题思路非常相似:之前我做这一类题没有一个固定的套路,想到哪写到哪,在某种程 ...

  6. 5-3 time模块

    1.取当前时间戳和当前格式化时间 import time1 # 以时间戳的形式打印当前时间 1543849862 print(int(time.time()))#时间戳 # 取当前格式化好的时间 20 ...

  7. relu函数是否存在梯度消失问题以及relu函数的死亡节点问题

    relu函数是否存在梯度消失问题以及relu函数的死亡节点问题 存在,在小于的时候,激活函数梯度为零,梯度消失,神经元不更新,变成了死亡节点. 出现这个原因可能是因为学习率太大,导致w更新巨大,使得输 ...

  8. STM32启动文件:startup_stm32f10x_hd.s等启动文件的简单描述

    在官方的库文件中,分别有如下文件: startup │ │ │ ├─arm │ │ │ │ startup_stm32f10x_cl.s │ │ │ │ startup_stm32f10x_hd.s ...

  9. FZU 2082 过路费(树链剖分)

    树链剖分模板题. FZU炸了,等交上去AC了再贴代码.

  10. UVA 1594 Ducci Sequence(紫书习题5-2 简单模拟题)

    A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers (a1, a2, · · · ...