bzoj 3027: [Ceoi2004]Sweet (生成函数)
来源:互联网 发布:虚拟机安装mac os 编辑:程序博客网 时间:2024/06/06 12:20
题目描述
传送门
题目大意:John得到了n罐糖果。不同的糖果罐,糖果的种类不同。第i个糖果罐里有 mi个糖果。John决定吃掉一些糖果,他想吃掉至少a个糖果,但不超过b个。问题是John 无法确定吃多少个糖果和每种糖果各吃几个。有多少种方法可以做这件事呢?
题解
感觉这种有数量限制的方案问题多数都可以用生成函数解决。
设
因为n的个数比较少,所以我们可以2的指数级别爆搜出所有的指数组合,就是将
那么
因为
那么这道题的答案就是
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define p 2004#define LL long long using namespace std;int n,a,b,ans,m,v[20];int C(int n,int m){ if (n<m) return 0; LL t=1; LL p1=1; for (int i=1;i<=m;i++) p1=p1*i; LL mod=(LL)p*p1; for (int i=n-m+1;i<=n;i++) t=(LL)t*i%mod; return (t/p1)%p;}void dfs(int x,int cnt,int sum){ if (x==n+1) { if (cnt&1) ans-=C(n+m-sum,n); else ans+=C(n+m-sum,n); return; } dfs(x+1,cnt,sum); dfs(x+1,cnt+1,sum+v[x]);}int solve(int x){ ans=0; m=x; dfs(1,0,0); return ans;}int main(){ freopen("a.in","r",stdin); freopen("my.out","w",stdout); scanf("%d%d%d",&n,&a,&b); for (int i=1;i<=n;i++) scanf("%d",&v[i]),v[i]++; int t=solve(b)-solve(a-1); printf("%d\n",(t%p+p)%p);}
0 0
- bzoj 3027: [Ceoi2004]Sweet (生成函数)
- [BZOJ3027][Ceoi2004]Sweet(生成函数)
- 3027: [Ceoi2004]Sweet
- bzoj 3028: 食物 (生成函数)
- BZOJ 4555 求和(生成函数+FFT)
- bzoj 3771: Triple (容斥原理+生成函数+FFT)
- BZOJ 3625 小朋友和二叉树(生成函数+FFT)
- BZOJ 3684 大朋友和多叉树(生成函数+FFT)
- SWEET
- Sweet!!!
- 【BZOJ2684】【CEOI2004】锯木厂选址(斜率优化,动态规划)
- BZOJ 3456 城市规划 NTT 生成函数计数 ***
- [生成函数 FFT] BZOJ 3771 Triple
- BZOJ 4772 显而易见的数论(生成函数+组合数学+数论)
- 【 bzoj 3992 】 [SDOI2015]序列统计 - NTT 生成函数
- bzoj 3684: 大朋友和多叉树 生成函数
- [生成函数 FFT 分块] BZOJ 3509 [CodeChef] COUNTARI
- [期望 生成函数 卷积 导数] BZOJ 4001 [TJOI2015]概率论
- hdu 1370 Biorhythms(中国剩余定理)
- 分数四则运算
- mybatis思维导图
- 浅谈JavaScript表单
- A
- bzoj 3027: [Ceoi2004]Sweet (生成函数)
- 如何用两个栈模拟队列操作
- 责任链模式 详解
- AlexNet-ImageNet Classification with Deep Convolutional Neural Networks
- Linux Makefile中赋值运算符=,:=,?=和+= 之间的区别
- google signing
- 答答租车系统(面向对象综合练习)
- 穷举法-有趣的数字(腾讯2017实习生编程题)
- kali破解隔壁wif(字典破解WPA/WPA2加密)