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

3027: [Ceoi2004]Sweet

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 135  Solved: 66
[Submit][Status][Discuss]

Description

John得到了n罐糖果。不同的糖果罐,糖果的种类不同(即同一个糖果罐里的糖果种类是相同的,不同的糖果罐里的糖果的种类是不同的)。第i个糖果罐里有 mi个糖果。John决定吃掉一些糖果,他想吃掉至少a个糖果,但不超过b个。问题是John 无法确定吃多少个糖果和每种糖果各吃几个。有多少种方法可以做这件事呢?

Input

从标准输入读入每罐糖果的数量,整数a到b 
 
John能够选择的吃掉糖果的方法数(满足以上条件)

Output

把结果输出到标准输出(把答案模 2004 输出)

1<=N<=10,0<=a<=b<=10^7,0<=Mi<=10^6

Sample Input

2 1 3

3

5

Sample Output

9

HINT

(1,0),(2,0),(3,0),(0,1),(0,2),(0,3),(1,1),(1,2),(2,1)

Source

对糖果是否装满容斥,通过插板法计算方案。

模数不为质数但n很小,可以将模数乘n!之后除n!。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #define LL long long
 8 using namespace std;
 9 LL n,a,b;
10 LL m[50];
11 LL mod=2004,mul=1;
12 LL c(LL x,LL y) {
13     if(x<y) return 0;
14     LL ans=1;
15     for(int i=x;i>=x-y+1;i--) ans=1LL*ans*i%mod;
16     return (ans/mul)%2004LL;
17 }
18 LL cnt(LL x) {
19     LL ans=0;
20     for(int i=0;i<(1<<n);i++) {
21         LL f=0,s=x;
22         for(int j=1;j<=n;j++) if((1<<(j-1))&i) f++,s-=m[j]+1;
23         if(s<0) continue;
24         if(f&1) ans-=c(s+n,n);
25         else ans+=c(s+n,n);
26         ans%=2004LL;
27     }
28     return ans;
29 }
30 int main() {
31     scanf("%lld%lld%lld",&n,&a,&b);
32     for(int i=1;i<=n;i++) scanf("%lld",&m[i]);
33     for(int i=1;i<=n;i++) mod*=i,mul*=i;
34     printf("%lld",((cnt(b)-cnt(a-1))%2004LL+2004LL)%2004LL);
35 }

原文地址:https://www.cnblogs.com/wls001/p/8126142.html

时间: 2024-08-29 16:07:42

[BZOJ3027][Ceoi2004]Sweet 容斥+组合数的相关文章

[BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 m 减去 Ai - 1 ,相当于将这一部分固定分给 xi,就转化为无限制的情况了. 如果有一些限制条件是 xi <= Ai 呢?直接来求就不行了,但是注意到这样的限制不超过 8 个,我们可以使用容斥原理来求. 考虑容斥:考虑哪些限制条件被违反了,也就是说,有哪些限制为 xi <= Ai 却是 xi

[AHOI2015 Junior] [Vijos P1943] 上学路上 【容斥+组合数】

题目链接:Vijos - P1943 题目分析 这是 AHOI 普及组的题目,然而我并不会做= =弱到不行= = 首先,从 (x, 0) 到 (0, y) 的最短路,一定是只能向左走和向上走,那么用组合数算一下方案数是 C(x + y, x) ,记为 Solve(x, y), 其实就是将 y 次向上走分配到 x + 1 个横坐标上. 那么不考虑不能有交点的方案就是 Solve(x1, y1) * Solve(x2, y2) . 然后题目要求两条路径不能有交点,那么我们就考虑容斥,用总的方案减去有

【BZOJ4710】[Jsoi2011]分特产 组合数+容斥

[BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产. 例如,JYY 带来了2 袋麻花和1 袋包子,分给A 和B 两位同学,那么共有4 种不同的分配方法: A:麻花,B:麻花.包子 A:麻花.麻花,B:包子 A:包子,B:麻花.麻

Codeforces 100548F - Color (组合数+容斥)

题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选k种颜色有C(m, k)种方案,对于k种颜色方案为k*(k-1)^(n-1)种.但是C(m, k)*k*(k-1)^(n-1)方案包括了选k-1,k-2...,2种方案. 题目要求刚好k种颜色,所以这里想到用容斥. 但是要是直接C(m, k)*k*(k-1)^(n-1) - C(m, k-1)*(k

HAOI2018 [HAOI2018]染色 【组合数 + 容斥 + NTT】

题目 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种. 然而小 C 只关心序列的 \(N\) 个位置中出现次数恰好为 \(S\) 的颜色种数, 如果恰 好出现了 \(S\) 次的颜色有 \(K\) 种, 则小 C 会产生 \(W_k\) 的愉悦度. 小 C 希望知道对于所有可能的染色方案, 他能获得的愉悦度的和对 1004535809 取模的结果是多少. 输入格式 从

【题解】分特产(组合数+容斥)

[题解]分特产(组合数+容斥) 一道小水题. 假如没有这个要求每个人都要有一个特产的限制我们直接可以组合数. 我们又发现人(本质上)是没有区别的,所以容斥的复杂度只有\(O(n)\) \(n\)个人分\(m\)个特产,每个特产有\(a_i\)个,人可以不拿特产,的方案数就是把\(a_i\)分成\(n\)份,而且可以分为\(0\)份. 这个的答案就是 \[ f(n)=\prod_{i=1}^m {a_i+n-1\choose n-1} \] 意思就是有\(a_i+n\)个球分成不为空\(n\)份的

【BZOJ2839】集合计数 组合数+容斥

[BZOJ2839]集合计数 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是质数喔~) Input 一行两个整数N,K Output 一行为答案. Sample Input 3 2 Sample Output 6 HINT [样例说明]假设原集合为{A,B,C}则满足条件的方案为:{AB,ABC},{AC,ABC},{BC,ABC},{AB

【BZOJ3782】上学路线 组合数+容斥+CRT

[BZOJ3782]上学路线 Description 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不能通过这些路口.小C喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走:而小C又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条.由于答案可能很大,所以小C只需要让你求出路径数mod P的值. Input 第一行,四个整数N.M.T.P. 接下来的T

HDU5794 A Simple Chess 容斥+lucas

分析:转自http://blog.csdn.net/mengzhengnan/article/details/47031777 一点感想:其实这个题应该是可以想到的,但是赛场上并不会 dp[i]的定义很巧妙,容斥的思路也非常清晰 然后就是讨论lucas的用法,首先成立的条件是mod是素数 但是如果这个题mod很大,组合数取模感觉就不太可做了 我认为当mod很大时,n应该很小可以预处理,但是n很大时mod应该比较小,这样也可以预处理 如果n和mod都很大我就不会了.... 这个题在预处理的时候,同