BZOJ3027 - [CEOI2004]Sweet
Description
给出\(n(n\leq10),a,b(a,b\leq10^7)\)与\(\{c_n\}(c_i\leq10^6)\),求使得\(\sum_{i=1}^n x_i \in[a,b]\)且\(x_i\in[0,c_i]\)的方案数,对\(2004\)取模。
Solution
定义\(f(m)\)表示“将不超过\(m\)个物品放入\(n\)个盒子,且第\(i\)个盒子中的物品数在\([0,c_i]\)范围内”的方案数。原问题就是求\(f(b)-f(a-1)\)。我们进行容斥:
有\(0\)个盒子超出范围=至少有\(0\)个盒子超出范围-至少有\(1\)个盒子超出范围+至少有\(2\)个盒子超出范围-...
因为\(n\leq10\),所以我们可以枚举哪些盒子超出范围,共有\(2^n\)种。接下来我们只需求:将不超过\(m\)个物品放入\(n\)个盒子中,对于其中的\(k\)个盒子\(p_1..p_k\),其中的物品数超过范围的方案数。
我们先向这\(k\)个盒子里分别放入\(c+1\)个物品,然后再将剩下的物品放进\(n\)个盒子。将不超过\(m_0\)个物品放进\(n\)个盒子的方案数为\(\binom{m_0+n}{n}\),也就是将\(m_0\)分成\(n+1\)个非负整数的方案数。如果无法让\(k\)个盒子都超出范围,方案数就为\(0\)。
不过一个组合数对\(2004\)取模很烦。一般来说,如果要模一个不能表示成\(p^q\)的数,需要用中国剩余定理进行展开再用扩展Lucas定理。\(2004=2^2\times 3\times 167\),分别对\(2^2,3,167\)取模再组合起来。不过因为这道题\(n\)很小,所以有一种简单做法:
证明:\(\dfrac{a}{b} \bmod m= \dfrac{a \bmod bm}{b}\)。
设\(\dfrac{a}{b} \bmod m=c\),则有\(\dfrac{a}{b} = k\cdot m+c \Rightarrow a=k\cdot bm +bc\)
所以\(a \bmod bm=bc\),即\(c=\dfrac{a \bmod bm}{b}\)。
对于本题来说,\(\dbinom{m_0+n}{n} \bmod2004=\dfrac{\prod_{i=0}^{n-1}(m_0+n-i) \bmod (2004\cdot n!)}{n!}\),\(O(n)\)暴力计算即可。
时间复杂度\(O(n2^n)\)。
Code
//[CEOI2004]Sweet
#include <cstdio>
typedef long long lint;
lint const H=2004;
int n,a[20];
lint facN;
int C(int a,int b)
{
lint r=1;
for(int i=1;i<=b;i++) r=(r*(a-i+1))%(facN*H);
return r/facN;
}
int dfs(int x,int m,int cnt)
{
if(m<0) return 0;
if(x>n) return ((cnt&1?-1:1)*C(m+n,n)+H)%H;
int r=0;
r+=dfs(x+1,m-a[x]-1,cnt+1);
r+=dfs(x+1,m,cnt);
return r%H;
}
int main()
{
int x,y; scanf("%d%d%d",&n,&x,&y);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
facN=1; for(int i=1;i<=n;i++) facN=facN*i;
int ans=dfs(1,y,0)-dfs(1,x-1,0);
printf("%lld\n",(ans+H+H)%H);
return 0;
}
P.S.
%%%Icefox,%%%Pickupwin
BZOJ3027 - [CEOI2004]Sweet的更多相关文章
- [BZOJ3027][Ceoi2004]Sweet 容斥+组合数
3027: [Ceoi2004]Sweet Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 135 Solved: 66[Submit][Status] ...
- 2018.12.30 bzoj3027: [Ceoi2004]Sweet(生成函数+搜索)
传送门 生成函数好题. 题意简述:给出n个盒子,第iii个盒子里有mim_imi颗相同的糖(但不同盒子中的糖不相同),问有多少种选法可以从各盒子中选出数量在[a,b][a,b][a,b]之间的糖果. ...
- 【BZOJ 3027】 3027: [Ceoi2004]Sweet (容斥原理+组合计数)
3027: [Ceoi2004]Sweet Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 71 Solved: 34 Description John ...
- bzoj 3027: [Ceoi2004]Sweet (生成函数)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3027. 题目大意:有$n$种数,每种有$C_i$个,问你在这些数中取出$[l,r]$个 ...
- bzoj 3027 [Ceoi2004]Sweet——生成函数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027 化式子到 ( \mul_{i=1}^{n}(1-x^(m[i]+1)) ) / (1- ...
- BZOJ 3027: [Ceoi2004]Sweet
容斥 #include<cstdio> using namespace std; int a,b,n,m[15]; long long ans=0,mod=2004; long long ...
- bzoj 3027 [Ceoi2004] Sweet —— 生成函数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027 就是 (1+x+x2+...+xm[i]) 乘起来: 原来想和背包一样做,然而时限很短 ...
- bzoj 3027: [Ceoi2004]Sweet【生成函数+组合数学】
首先根据生成函数的套路,这个可以写成: \[ \prod_{i=1}^{n}(1+x^1+x^2+...+x^{c[i]}) \] 然后化简 \[ =\prod_{i=1}^{n}\frac{1-x^ ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- archsummit_bj2016
http://bj2016.archsummit.com/schedule 大会日程 2016年12月02日,星期五 7:45-9:00 签到 8:45-9:00 开始入场 9:00-9:30 开场致 ...
- P1179 数字统计
题目描述 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数. 比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出 现 1 次 ...
- asp.net MVC中实现调取web api
public ActionResult Index(string city) { if (string.IsNullOrEmpty(city)) { city = "上海"; } ...
- Java JDK装配置
1- 介绍 本文章介绍JAVA开发环境安装是基于: Java8(JDK8) 2- 下载JDK http://www.oracle.com/technetwork/java/javase/dow ...
- COGS 495. 窗口
★☆ 输入文件:window.in 输出文件:window.out 简单对比时间限制:2 s 内存限制:256 MB [问题描述] 给你一个长度为N的数组,一个长为K的滑动的窗体从最左 ...
- COGS 1743. 忠诚
★ 输入文件:faithful.in 输出文件:faithful.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 老管家是一个聪明能干的人.他为财主工作了整整1 ...
- Jenkins邮件扩展插件Email Extension Plugin配置使用
1.在管理插件中搜索并安装邮件扩展插件Email Extension Plugin: 2.在任务中增加构建后操作步骤,选择Editable Email Notification; 3.在高级中Add ...
- Django创建第一个应用
一.创建第一个应用,并在settings.py中添加. python manage.py startapp article 二.创建第一个模型 class Article(models.Model): ...
- SQLite – ORDER 子句
SQLite - ORDER BY子句 The SQLite ORDER BY子句用于数据按升序或降序排序,基于一个或多个列. 语法: ORDER BY子句的基本语法如下: SELECT column ...
- Android(java)学习笔记156:开源框架post和get方式提交数据(qq登录案例)
1. 前面提到Http的get/post方式 . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2. Android应用会经常使用http协议进行传输,网上会有很 ...