BZOJ4665 : 小w的喜糖

考虑枚举哪些人一定不合法,那么方案数可以通过简单的排列组合算出。

于是设$f[i][j]$表示前$i$种糖果,一共有$j$个人一定不合法的方案数,但是这样并不能保证其他人一定合法,所以需要进行容斥。

最后将答案除以每种糖果数量的阶乘,即可保证本质不同。

时间复杂度$O(n^2)$。

#include<cstdio>
const int N=2005,P=1000000009;
int n,i,j,k,x,a[N],C[N][N],fac[N],inv[N],f[N][N],tmp,ans;
int main(){
  scanf("%d",&n);
  for(i=1;i<=n;i++)scanf("%d",&x),a[x]++;
  for(C[0][0]=i=1;i<=n;i++)for(C[i][0]=j=1;j<=i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;
  for(fac[0]=fac[1]=inv[0]=inv[1]=1,i=2;i<=n;i++){
    fac[i]=1LL*fac[i-1]*i%P;
    inv[i]=1LL*(P-inv[P%i])*(P/i)%P;
  }
  for(i=2;i<=n;i++)inv[i]=1LL*inv[i]*inv[i-1]%P;
  for(f[0][0]=i=1;i<=n;i++)for(j=0;j<=n;j++)for(k=0;k<=a[i]&&k<=j;k++)
    f[i][j]=(1LL*f[i-1][j-k]*C[a[i]][k]%P*fac[a[i]]%P*inv[a[i]-k]+f[i][j])%P;
  for(i=0;i<=n;i++){
    tmp=1LL*f[n][i]*fac[n-i]%P;
    if(i&1)ans=(ans-tmp+P)%P;else ans=(ans+tmp)%P;
  }
  for(i=1;i<=n;i++)ans=1LL*ans*inv[a[i]]%P;
  return printf("%d",ans),0;
}

  

时间: 2024-10-13 01:45:57

BZOJ4665 : 小w的喜糖的相关文章

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

小w的喜糖 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4665 数据范围:略. 题解: 二项式反演裸题. $f_{i,j}$表示,前$i$种钦定$j$拿到自己种类糖果的方案数. 求完了之后可以二项式反演回来即可. 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod = 1000000009 ; int n, m; ll

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

4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每个人手中的糖的种类都与原来不同. 两个方案不同当且仅当,存在一个人,他手中的糖的种类在两个方案中不一样. Input 第一行,一个整数n 接下来n行,每行一个整数

武汉科技大学ACM :1008: 小t和小w

Problem Description 小t最近学了C语言,他想要在女朋友小w面前展示一下自己的能力,小w喜欢如样例所示的图形, 想让小t写一个程序来输出这样的图形,小t拿到后感觉有点困难,小t不想在女朋友面前尴尬, 所以聪明的你来帮助帮助他吧. Input 输入图形所占的列数n(n<20且n为奇数)(多组数据) Output 输出图形,输出一个图形后面接一行换行 Sample Input 5 7 Sample Output * *** ***** *** * * *** ***** *****

hihocoder 1191 小W与网格 (组合数)

时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个n*m的网格,左上角(1, 1),右下角(n, m). 小w在(i, j),他会从"上左下右"四个方向中选定两个不同但正交的方向,然后他只能沿着这两个方向走,直到他走出网格. 小w想知道有多少种不同的走法. 两个走法不同当且仅当所经过的格子的集合不同. 输入 输入包含多组数据. 每组数据一行四个整数n, m, i, j.(1 <= i <= n <= 100, 1 <= j &l

企业社交网络流行,小W的分析状况

随着现在的网络发展趋势,企业社交网络正式现在所流行的,我自己也在网上搜了很多有关社交的网站,但是很难下决定说选择哪个平台更适合企业用.我就问了我在做网站的朋友,他让我每个社交都可以尝试下并推荐体验下网信商务社交,同时我也觉得可以试下,反正要试过才知道适不适合. 在朋友的解说下,完全认识了企业社交网络.大概的看了一眼,了解了整个架构.然而网信这个平台可以给小W带来以下功能: 1. 积累人脉 用户在商务社交网络上的人脉会迅速扩张,这样可以建立起一张强大的人际关系网,并不断认识新的商业伙伴和朋友. 2

bzoj 2441 [中山市选2011]小W的问题

bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x5, y5),如果满足: ·x1 < x2 < x3 < x4 < x5 ·y1 > y3 > y2 ·y5 > y3 > y4 则称它们构成一个&quo

[JZOJ5165] 小W的动漫

[JZOJ5165] 小W的动漫 (sort.cpp 1s 256M) 小WW最近迷上了日本动漫,每天都有无数部动漫的更新等着他去看,所以他必须将所有的动漫排个顺序,当然,虽然有无数部动漫,但除了1号动漫,每部动漫都有且仅有一部动漫是它的前传(父亲),也就是说,所有的动漫形成一个树形结构.而动漫的顺序必须满足以下两个限制: ①一部动漫的所有后继(子孙)都必须排在它的后面. ②对于同一部动漫的续集(孩子),小W喜爱度高的须排在前面. 光排序小WW还不爽,他想知道一共有多少种排序方案,并且输出它mo

【JZOJ6389】小w学图论

description 小w这学期选了门图论课,他在学习点着色的知识.他现在得到了一张无向图,并希望在这张图上使用最多n种颜色给每个节点染色,使得任意一条边关联的两个节点颜色不同. 小w获得一张n个节点m条边的基图,并得到了一份神秘代码.他会根据这份代码的内容构建完整的无向图. while(1){ int modify_tag=0; for(int x=1;x<=n;x++) for(int y=x+1;y<=n;y++) for(int z=y+1;z<=n;z++) if(edge(

bzoj2441 小W的问题

bzoj2441 按照纵坐标排序,从小到大插入数列中,每个点i维护一个data[i]表示未插入序列中横坐标小于i的数的个数(用线段树)其实点i就是“W”中第一个极小点,那么f[j]就等于1到j-1中所有已插入的data之和(也用线段树),j点就是“W”的极大点,为什么呢?因为现在在未插入数列中的数都是大于j的纵坐标的.这样就能求出以j为右端点的“V”的个数. 用同样的办法求出以j为左端点的“V”的个数g[j].ans=sum(f[j]*g[j])  j=1...n