BZOJ 4665: 小w的喜糖
Sol
DP+容斥.
这就是一个错排的扩展...可是想到容斥却仅限于种数的容斥,如果种数在一定范围内我就会做了QAQ.
但是容斥的是一定在原来位置的个数.
发现他与原来的位置无关,可以先把每个同种的糖看成本质不同的来DP.
\(f[i][j]\) 表示前 \(i\) 种糖,一定有 \(j\) 个不合法的方案数.
然后在第 \(i\) 种内枚举有几种不合法的状态.这样就可以从前 \(i-1\) 种转移了.
然后随便搞搞组合数,还有线性计算逆元,上篇随笔里提到了.
Code
/**************************************************************
Problem: 4665
User: BeiYu
Language: C++
Result: Accepted
Time:2548 ms
Memory:32720 kb
****************************************************************/ #include<cstdio>
#include<iostream>
using namespace std; const int N = 2005;
const int Mo = 1000000009;
typedef long long LL; int n,m;LL ans;
int a[N],fac[N],inv[N],C[N][N];
int f[N][N]; inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
int main(){
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout); n=in(),fac[0]=fac[1]=1,C[0][0]=1,f[0][0]=1; inv[0]=inv[1]=1;
for(int i=2;i<=n;i++) inv[i]=(LL)(Mo-Mo/i)*inv[Mo%i]%Mo,fac[i]=(LL)fac[i-1]*i%Mo;
// for(int i=1;i<=n;i++) cout<<inv[i]<<" ";cout<<endl;
for(int i=2;i<=n;i++) inv[i]=(LL)inv[i-1]*inv[i]%Mo;
for(int i=1;i<=n;i++) for(int j=0;j<=i;j++) if(!j) C[i][j]=1;else C[i][j]=(LL)(C[i-1][j-1]+C[i-1][j])%Mo; for(int i=1;i<=n;i++) a[in()]++;
for(int i=1;i<=n;i++) if(a[i]) a[++m]=a[i]; for(int i=1;i<=m;i++) for(int j=0;j<=n;j++) for(int k=0;k<=a[i]&&k<=j;k++)
f[i][j]=(LL)(f[i][j]+(LL)f[i-1][j-k]*C[a[i]][k]%Mo*fac[a[i]]%Mo*inv[a[i]-k])%Mo; for(int i=0;i<=n;i++) if(i&1) ans=(ans-(LL)f[m][i]*fac[n-i]%Mo+Mo)%Mo;else ans=(ans+(LL)f[m][i]*fac[n-i]%Mo)%Mo;
for(int i=1;i<=m;i++) ans=ans*inv[a[i]]%Mo;
cout<<ans<<endl;
// for(int i=1;i<=n;i++) for(int j=0;j<=n;j++) printf("%d%c",f[i][j]," \n"[j==n]);
return 0;
}
BZOJ 4665: 小w的喜糖的更多相关文章
- ●BZOJ 4665 小w的喜糖
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4665 题解: 容斥,dp令 v[i] 表示原来拥有i类糖果的人数. (一个套路,首先把每个糖 ...
- 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 94 Solved: 53 Description 废话不多说,反正小w要发喜 ...
- bzoj4665小w的喜糖 dp+容斥
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 120 Solved: 72[Submit][Status][Discuss] ...
- bzoj4665 小w的喜糖(dp+容斥)
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 222 Solved: 130[Submit][Status][Discuss ...
- [bzoj4665]小w的喜糖_二项式反演
小w的喜糖 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4665 数据范围:略. 题解: 二项式反演裸题. $f_{i,j}$表示,前$i$种钦 ...
- 【BZOJ4665】小w的喜糖 容斥+组合数
[BZOJ4665]小w的喜糖 Description 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那 ...
- 小w的喜糖(candy)
小w的喜糖(candy) 题目描述 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每 ...
- BZOJ4665: 小w的喜糖 DP
对于这道题,首先每个人的位置并不影响结果 所以我们可以将相同颜色糖果的人放在一块处理 设 $f_{i,j}$ 表示处理到第 $i$ 种糖果至少有 $j$ 人的糖果和原先的类型相同 枚举当前种类中不满足 ...
- BZOJ4665 : 小w的喜糖
考虑枚举哪些人一定不合法,那么方案数可以通过简单的排列组合算出. 于是设$f[i][j]$表示前$i$种糖果,一共有$j$个人一定不合法的方案数,但是这样并不能保证其他人一定合法,所以需要进行容斥. ...
随机推荐
- shiro 更改登录的用户名
ShiroUser user = (ShiroUser) SecurityUtils.getSubject().getPrincipal(); user.name = newName;
- Java——新IO 缓冲区与Buffer
缓冲区和Buffer import java.nio.IntBuffer; //================================================= // File Na ...
- C# unmanaged function pointers for iOS
C# unmanaged function pointers for iOS Just a reminder to myself when I need this thing next time fo ...
- ecshop如何判断缓存文件是否能更新
1.打开temp->static_caches文件夹 2.点击后台“清楚缓存” 3.看static_caches文件夹里是否有文件删除 删除->可以更新缓存 否-> 不能更新缓存
- FPS
游戏的FPS跟什么有关 http://zhidao.baidu.com/link?url=jZJoN_-MTC9fWCBSBaL5vezBp13MRSv8PdCcQMbwX5tiFGzxNEHe7UB ...
- 捕获EF提交异常
try { } catch (DbEntityValidationException dbex) { string errMsg = string.Empty; foreach (var eve in ...
- Unity中各个平台的预编译的运用方式
1,unity中官方文档的一个操纵关键词 Platform Dependent Compilation 2,常用的预编译关键词 UNITY_EDITOR 编辑器调用.UNITY_STA ...
- MV*模式的个人理解
MV*模式主要解决的问题就是 View代码难以维护的问题. MV*模式将View中的逻辑分离出去,形成一个弱逻辑的易于维护的视图. MV*中的*是Model和View的桥梁,负责保持Model和Vie ...
- StringUtils
StringUtils.hasText(字符串) 如果字符串里面的值为null, "", " ",那么返回值为false:否则为true
- 大熊君大话NodeJS之------Net模块
一,开篇分析 从今天开始,我们来深入具体的模块学习,这篇文章是这个系列(大熊君大话NodeJS)文章的第三篇,前两篇主要是以理论为主,相信大家在前两篇的学习中, 对NodeJS也有一个基本的认识,没事 ...