Portal

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的更多相关文章

  1. [BZOJ3027][Ceoi2004]Sweet 容斥+组合数

    3027: [Ceoi2004]Sweet Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 135  Solved: 66[Submit][Status] ...

  2. 2018.12.30 bzoj3027: [Ceoi2004]Sweet(生成函数+搜索)

    传送门 生成函数好题. 题意简述:给出n个盒子,第iii个盒子里有mim_imi​颗相同的糖(但不同盒子中的糖不相同),问有多少种选法可以从各盒子中选出数量在[a,b][a,b][a,b]之间的糖果. ...

  3. 【BZOJ 3027】 3027: [Ceoi2004]Sweet (容斥原理+组合计数)

    3027: [Ceoi2004]Sweet Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 34 Description John ...

  4. bzoj 3027: [Ceoi2004]Sweet (生成函数)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3027. 题目大意:有$n$种数,每种有$C_i$个,问你在这些数中取出$[l,r]$个 ...

  5. bzoj 3027 [Ceoi2004]Sweet——生成函数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027 化式子到 ( \mul_{i=1}^{n}(1-x^(m[i]+1)) ) / (1- ...

  6. BZOJ 3027: [Ceoi2004]Sweet

    容斥 #include<cstdio> using namespace std; int a,b,n,m[15]; long long ans=0,mod=2004; long long ...

  7. bzoj 3027 [Ceoi2004] Sweet —— 生成函数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027 就是 (1+x+x2+...+xm[i]) 乘起来: 原来想和背包一样做,然而时限很短 ...

  8. bzoj 3027: [Ceoi2004]Sweet【生成函数+组合数学】

    首先根据生成函数的套路,这个可以写成: \[ \prod_{i=1}^{n}(1+x^1+x^2+...+x^{c[i]}) \] 然后化简 \[ =\prod_{i=1}^{n}\frac{1-x^ ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. Unity Mesh 初体验

    什么是Mesh Mesh是Unity中的一个组件,称为网格组件.通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而一个复杂的多边形,实际上是由多个三角面拼接而成.所以一个3D模型的表面是 ...

  2. import和from .xxx import *的一点重要区别

    import zzz 不会导入zzz中已导入的模块 from .xxx import * 会导入xxx中已导入的模块 特别注意: 使用logging时,x模块导入了log.py,y模块导入了log.p ...

  3. RCC 2014 Warmup (Div. 1)

    A 暴力 #include <iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  4. 【学习笔记】深入理解js原型和闭包(11)——执行上下文栈

    继续上文的内容. 执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境.当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境.处于活动状态的执行 ...

  5. php 生成饼状图,折线图,条形图 通用类 2

    生成饼状图,折线图,条形图通用的php类,这里使用的是国外的 HighCharts,前台页面别忘了调用HighCahrt  js HighCharts中文网站  http://www.hcharts. ...

  6. springdata-jpa 八种查询方法

    使用:maven+Spring+jpa+Junit4 查询方式:SQL,JPQL查询,Specification多条件复杂查询 返回类型:list<POJO>,list<Stinrg ...

  7. javajsp,Servlet:Property 'Id' not found

    avax.el.PropertyNotFoundException: Property 'Id' not found on type  org.androidpn.server.model.CarSo ...

  8. Android小玩意儿-- 从头开发一个正经的MusicPlayer(三)

    MusicService已经能够接收广播,通过广播接收的内容来做出相应的MediaPlayer对象的处理,包括播放,暂停,停止等,并当MediaPlayer对象的生命周期发生变化的时候,同样通过发送广 ...

  9. http://www.360doc.com/content/10/0928/12/11991_57014502.shtml

    http://www.360doc.com/content/10/0928/12/11991_57014502.shtml

  10. 如何使用xftp工具在Windows与Linux之间传输文件

    如何使用xftp工具在Windows与Linux之间传输文件 整理者:vashon 声明:感谢开源社区 xftp工具是一款SFTP,FTP文件传输软件,可在Windows pc与Unix/Linux之 ...