Codeforces 451 E. Devu and Flowers(组合数学,数论,容斥原理)

传送门

解题思路:

假如只有 s 束花束并且不考虑 f ,那么根据隔板法的可重复的情况时,这里的答案就是

假如说只有一个 f 受到限制,其不合法时一定是取了超过 f 的花束

那么根据组合数,我们仍然可以算出其不合法的解共有:

最后,由于根据容斥,减两遍的东西要加回来,那么含有偶数个 f 的项为正,奇数个时为负。

答案就是:

搜索答案,使用Lucas定理,计算组合数上下约去。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 typedef long long lnt;
 5 const lnt mod=(lnt)(1e9+7);
 6 int n;
 7 lnt s,ans;
 8 lnt f[1000];
 9 lnt ksm(lnt x,lnt y)
10 {
11     lnt ans=1;
12     while(y)
13     {
14         if(y&1)
15             ans=ans*x%mod;
16         x=x*x%mod;
17         y=y/2;
18     }
19     return ans;
20 }
21 lnt Lucas(lnt n,lnt m)
22 {
23     if(n<mod&&m<mod)
24     {
25         if(n<m)    return 0;
26         if(n==m)return 1;
27         if(m==0)return 1;
28         lnt nj=1,mj=1;
29         lnt a=n-m,b=m;
30         if(a>b)
31             std::swap(a,b);
32         lnt i=b+1;
33         while(i<=n)
34         {
35             nj=(nj*i)%mod;
36             i++;
37         }
38         i=2;
39         while(i<=a)
40         {
41             mj=(mj*i)%mod;
42             i++;
43         }
44         return ksm(mj,mod-2)*nj%mod;
45     }
46     return Lucas(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
47 }
48 lnt dle(lnt x)
49 {
50     return (((1&x)^1)<<1)-1;
51 }
52 void dfs(int p,int l,lnt sum)
53 {
54     if(p==n+1)
55     {
56         ans=(ans+dle(l)*Lucas(s-sum+n-1,n-1))%mod;
57         return ;
58     }
59     dfs(p+1,l,sum);
60     dfs(p+1,l+1,sum+f[p]+1);
61     return ;
62 }
63 int main()
64 {
65     scanf("%d%I64d",&n,&s);
66     for(int i=1;i<=n;i++)
67         scanf("%I64d",&f[i]);
68     ans=0;
69     dfs(1,0,0);
70     printf("%I64d\n",(ans%mod+mod)%mod);
71     return 0;
72 }

原文地址:https://www.cnblogs.com/blog-Dr-J/p/9886532.html

时间: 2024-10-11 02:08:33

Codeforces 451 E. Devu and Flowers(组合数学,数论,容斥原理)的相关文章

Devu and Flowers lucas定理+容斥原理

Devu wants to decorate his garden with flowers. He has purchased n boxes, where the i-th box contains fi flowers. All flowers in a single box are of the same color (hence they are indistinguishable). Also, no two boxes have flowers of the same color.

Codeforces #258 Div.2 E Devu and Flowers

大致题意: 从n个盒子里面取出s多花,每个盒子里面的花都相同,并且每个盒子里面花的多数为f[i],求取法总数. 解题思路: 我们知道如果n个盒子里面花的数量无限,那么取法总数为:C(s+n-1, n-1) = C(s+n-1, s). 可以将问题抽象成:x1+x2+...+xn = s, 其中0<=xi <= f[i],求满足条件的解的个数. 两种方法可以解决这个问题: 方法一:这个问题的解可以等价于:mul = (1+x+x^2+...+x^f[1])*(1+x+x^2+...+x^f[2]

codeforces 451E Devu and Flowers

题意:有n个瓶子每个瓶子有 f[i] 支相同的颜色的花(不同瓶子颜色不同,相同瓶子花视为相同) 问要取出s支花有多少种不同方案. 思路: 如果每个瓶子的花有无穷多.那么这个问题可以转化为  s支花分到n个瓶子有多少种方案  用隔板法就能解决 C(s+n-1,n-1) .有限制之后我们可以 用 没限制的去减掉那些违反限制的 如果只有一个瓶子取得花超出上限 那么减去,两个瓶子 要加上(容斥原理) n只有20  就能暴力枚举那些取超过上限f[i]的瓶子并且在这些瓶子至少选出 f[i]+1 支花  统计

Codeforces Round #258 (Div. 2)Devu and Flowers 容斥原理

题目:Codeforces Round #258 (Div. 2)Devu and Flowers 题意:n个boxes ,第i个box有fi个flowers,每个boxes中的flowers完全相同,不同boxes的flowers不同,求从n个boxes中取出s个flowers的方案数.n<=20,s<=1e14,fi<=1e12. 排列组合的题目,一解法可用容斥原理(inclusion exclusion principle) . 有2中写法dfs和集合.下为集合写法. #inclu

Codeforces 451E Devu and Flowers(容斥原理)

题目链接:Codeforces 451E Devu and Flowers 题目大意:有n个花坛.要选s支花,每一个花坛有f[i]支花.同一个花坛的花颜色同样,不同花坛的花颜色不同,问说能够有多少种组合. 解题思路:2n的状态,枚举说那些花坛的花取超过了,剩下的用C(n?1sum+n?1)隔板法计算个数.注意奇数的位置要用减的.偶数的位置用加的.容斥原理. #include <cstdio> #include <cstring> #include <cmath> #in

CF451E Devu and Flowers(容斥)

CF451E Devu and Flowers(容斥) 题目大意 \(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案.不一定每种花都要选到. \(n\le 20\) 解法 利用可重组合的公式. 不考虑\(f_i\)的限制,直接可重组合的方案是,意思是从可以重复的\(n\)个元素中取出\(r\)个的个数.注意,根据定义,此时\(r\)种每个都要选. \[ f(s,r)={s+r-1 \choose r-1} \] 考虑限制怎么办,我们先容斥. 我们可以钦定某些花选择了\(f_i+1\)

UVA 11806 - Cheerleaders(数论+容斥原理)

题目链接:11806 - Cheerleaders 题意:在一个棋盘上,要求四周的四行必须有旗子,问有几种摆法. 思路:直接算很容易乱掉,利用容斥原理,可知AUBUCUD = |A| + |B| + |C| + |D| - |AB| - |BC| - |AC| - |AD| - |BD| - |CD| + |ABC| + |ABD| + |ACD| + |BCD| - |ABCD| 由此利用位运算去计算即可 代码: #include <stdio.h> #include <string.

[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数.要保证每行每列的格子上的数最小值为1,有多少种方案 \(n \leq 250,k \leq 10^9\) 分析 这题有\(O(n^3)\)的dp做法,但个人感觉不如\(O(n^2 \log n)\)直接用数学方法求更好理解. 考虑容斥原理,枚举有\(i\)行最小值>1,有\(j\)行最小值>1,那

codeforces 396A A. On Number of Decompositions into Multipliers(组合数学+数论)

题目链接: codeforces 396A 题目大意: 给出n个数的序列,求取和这个序列的积相同但是序列本身不同的个数. 题目分析: 组合数学的问题,对于每一个数我们可以将它分解质因数,然后统计整个序列的各个质因数的个数. 那么符合要求的序列一定用这些质因数(每个质因数的个数保持不变)组成的,所以我们可以利用组合数学中的插板法,对每个质因数进行划分,划分给n个数(存在一些数没有分到的情况),那么就是Cn?1质因数个数+n?1. 根据乘法原则,总的方案数就是每个质因数的划分数之积. AC代码: #