首页 > TAG信息列表 > cf451E
CF451E Devu and Flowers
Link Desciption 求一个可重集 \(S\) 的 \(m\) 子集的个数。\(S\) 的不同元素个数为 \(n\),\(n\leq 20\)。每种元素的个数 \(a_i\leq 10^{12}\) 。答案对 \(10^9+7\) 取模。 Solution 如果每种元素都有无数种的话,那么直接用插板法可得方案数为 \(\binom{m+n-1}{n-1}\)。但是问题是容斥原理解一般不定方程——cf451E经典题
/*给定n个盒子,第i个盒子有ai朵花,现在从中选取m朵花,问选取方案数用容斥定理解决 m=x1+x2+..+xnC(m+n-1,n-1)+sum{ (-1)^p * C(m+n-1-(1+n1)-(1+np),n-1) } */#include<bits/stdc++.h>using namespace std;#define ll long long #define mod 1000000007ll ans,n,s,A[30],inv[30]CF451E Devu and Flowers
CF luogu De javu 和开花 咕了半个月没更博了(捂脸) 这题如果值域小显然可以背包,但是这题是\(n\)小值域大,\(20\)可以让人想到状压.分析一下又发现可以容斥,枚举哪些物品超过个数限制,设枚举集合为\(S\),然后每个物品都要用\(a_i+1\)个,那么这个集合的贡献为\((-1)^{|S|}\binom{s-【CF451E】Devu and Flowers
题目大意:求多重集合的组合数, \(N \le 1e14,M \le 20\)。 题解: 考虑容斥原理,具体做法是枚举所有情况,即:枚举子集,第 i 位为 1 表示满足第 i 个条件,正负号采用 sign 进行判断。 对于本题的组合数来说,上指标过大,导致没办法预处理阶乘和逆元进行快速回答,不过下指标很小,可以按照定义进行枚CF451E Devu and Flowers
多重集求组合数,注意到\(n = 20\)所以可以用\(2 ^ n * n\)的容斥来写。 如果没有限制那么答案就是\(C(n + s - 1, n - 1)\)。对每一个限制依次考虑,加上有一种选多的,减去有两种选多的,以此类推。 由于\(n <= 20\),所以组合数事实上是可以\(O(N)\)求的=_= #include <bits/stdc++.h> usin