#3027. [Ceoi2004]Sweet 生成函数 + 组合数学
传送门
文章目录
- 题意:
- 思路:
题意:
思路:
这个题显然可以容斥来写,刚学生成函数就来水一下。
对于每一堆iii我们写出其生成函数Fi(x)=∑k=0mi(1+x+x2+...+xmi)=1−x1+mi1−xF_i(x)=\sum_{k=0}^{m_i}(1+x+x^2+...+x^{m_i})=\frac{1-x^{1+m_i}}{1-x}Fi(x)=∑k=0mi(1+x+x2+...+xmi)=1−x1−x1+mi,那么将所有堆的生成函数乘起来即G(x)=∏i=1nFi(x)=∏i=1n1−x1+mi1−x=(1−x)−n∗∏i=1n(1−x1+mi)G(x)=\prod_{i=1}^nF_i(x)=\prod_{i=1}^n \frac{1-x^{1+m_i}}{1-x}=(1-x)^{-n}*\prod_{i=1}^n(1-x^{1+m_i})G(x)=∏i=1nFi(x)=∏i=1n1−x1−x1+mi=(1−x)−n∗∏i=1n(1−x1+mi),对于后面的这项,由于nnn很小,所以展开最多只有2n2^n2n项,直接暴力展开即可。
对于前面的,我们用牛顿二项式定理展开(1−x)−n=∑i≥0(n+i−1i)xi(1-x)^{-n}=\sum_{i\ge0}\binom{n+i-1}{i}x^i(1−x)−n=∑i≥0(in+i−1)xi,可以得到对应的xxx项的系数,所以我们直接枚举∏i=1n(1−x1+mi)\prod_{i=1}^n(1-x^{1+m_i})∏i=1n(1−x1+mi)展开之后的指数为kkk的系数tkt_ktk,让后计算前面的项对答案的贡献,即tk∗∑i=a−kb−k(n−1−ii)t_k*\sum_{i=a-k}^{b-k}\binom{n-1-i}{i}tk∗∑i=a−kb−k(in−1−i),考虑将其转换成一个前缀和的形式,考虑到有∑i=0k(n−1+ii)=(n+kn)\sum_{i=0}^k\binom{n-1+i}{i}=\binom{n+k}{n}∑i=0k(in−1+i)=(nn+k),所以对上面式子进行化简ck∗((n+b−kb−k)−(n+a−k−1a−k−1))c_k*(\binom{n+b-k}{b-k}-\binom{n+a-k-1}{a-k-1})ck∗((b−kn+b−k)−(a−k−1n+a−k−1)),其实到这里应该就已经结束了,直接枚举2k2^k2k个ckc_kck让后直接得到答案即可。但是这个题模数不是个质数,而且组合数很大,所以考虑将其转换为ck∗((n+b−kn)−(n+a−k−1n))c_k*(\binom{n+b-k}{n}-\binom{n+a-k-1}{n})ck∗((nn+b−k)−(nn+a−k−1)),这样最多只有nnn项,且分母是n!n!n!,我们将模数乘上n!n!n!,在计算组合数的时候将其模上即可,这样就可避免组合数过大。
调了半天,代码很丑。。
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=20000010,INF=0x3f3f3f3f;
const double eps=1e-6;int n,a,b;
LL mod=2004;
int p[20];
LL inv[N],fun[N],now;LL C(int a,int b)
{if(a<0||b<0||a<b) return 0;LL noww=1;for(int i=a,j=b;j;i--,j--) (noww*=1ll*i%mod)%=mod;return (noww/now)%2004;
}int main()
{// ios::sync_with_stdio(false);
// cin.tie(0);cin>>n>>a>>b;now=1;for(int i=2;i<=n;i++) now*=i; mod*=now;for(int i=1;i<=n;i++) scanf("%d",&p[i]),p[i]++;map<int,int>mp;mp[0]=1;for(int i=1;i<=n;i++) {map<int,int>now=mp;for(auto x:mp) {now[x.X+p[i]]+=x.Y*(-1);}mp=now;}LL ans=0;for(auto x:mp) {int c=x.Y,k=x.X;LL now=(C(n+b-k,n)-C(n+a-k-1,n))%2004;ans+=c*now%2004; ans%=2004; ans+=2004; ans%=2004;}printf("%lld\n",ans);return 0;
}
/**/
#3027. [Ceoi2004]Sweet 生成函数 + 组合数学相关推荐
- bzoj 3027: [Ceoi2004]Sweet(母函数+组合数)
3027: [Ceoi2004]Sweet Time Limit: 1 Sec Memory Limit: 128 MB Submit: 169 Solved: 82 [Submit][Statu ...
- luogu P6078 [CEOI2004] Sweets(生成函数入门题)
我的生成函数只有幼儿园水平/kk https://www.luogu.com.cn/problem/P6078 首先对于一种糖,它的生成函数可以写成这样,封闭形式就是 ∑ j = 0 m i x j ...
- 任务管理软件 Things3 教程使用示例
0. 前言 0.1 本文的目录 图0. 本文目录 0.2 阅读本文能给你带来什么 任务管理软件Things3入门 + 作者对于Things3的使用流程 = 10分钟阅读 + 10分钟实践 1. Tin ...
- 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 2 )
文章目录 一.指数生成函数求解多重集排列示例 2 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相 ...
- 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 )
文章目录 一.指数生成函数求解多重集排列示例 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...
- 【组合数学】指数生成函数 ( 证明指数生成函数求解多重集排列 )
文章目录 一.证明指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...
- 【组合数学】指数生成函数 ( 指数生成函数性质 | 指数生成函数求解多重集排列 )
文章目录 一.指数生成函数性质 二.指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | ...
- 【组合数学】生成函数 ( 正整数拆分 | 重复有序拆分 | 不重复有序拆分 | 重复有序拆分方案数证明 )
文章目录 一.重复有序拆分 二.不重复有序拆分 1.无序拆分基本模型 2.全排列 三.重复有序拆分方案数证明 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式 ...
- 【组合数学】生成函数 ( 正整数拆分 | 正整数拆分基本模型 | 有限制条件的无序拆分 )
文章目录 一.正整数拆分基本模型 二.有限制条件的无序拆分 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...
最新文章
- laravel5.4 关于数据填充的知识
- 领导让我重构代码_领导不是由代码构成
- python ix loc iloc_pandas中的iloc、loc、ix有什么区别?
- Python开发【第三篇】:Python基本数据类型
- jvm性能调优实战 - 30使用jmap和jhat摸清线上系统的对象分布
- 如何理解clone对象
- 让vue-router渲染为指定的标签
- Java大牛分享的面试知识点
- cesium等高线_Cesium开源三维地球离线地图发布源码示例功能
- 25深入理解C指针之---传递数组
- 爬虫爬取下载qq音乐,又跟新的风口相关?(附源码和资料)
- 刘强东的高调,给京东带来了流量,也给京东带来了灾难
- 小丁是怎样入门git的
- java分页打印_谷歌Chrome打印分页
- 使用火车头采集器笔记
- 暗影格斗3服务器响应比预期,暗影格斗3代码问题导致无法正常游戏
- 沈阳建筑学计算机专硕调剂,2020年沈阳建筑大学硕士研究生招生考试网上调剂公告...
- 【毕设狗】【单片机毕业设计】基于单片机的温控风扇的设计–仿真设计
- angular UI框架
- 中国磷酸铁锂产业链发展潜力及投资前景评估报告2022-2028年版
热门文章
- java idea 模块_idea 多模块项目依赖父工程class找不到问题的方法
- 柠檬汁制成的电池可以开动超100千克的车子吗?
- 就两本书?还能吊起相扑选手?
- 有趣的物理照片,让你瞬间爱上物理!
- 如何逼疯一名数学系学生?
- 震撼!英伟达用深度学习做图像修复,毫无ps痕迹
- r语言用行名称提取数据框信息显示na_学会这些R语言技巧至少可以节省半年时间...
- java成员变量垃圾回收_JAVA 对象被垃圾回收后其成员变量可用吗? | 学步园
- c++游戏代码大全_还在学少儿编程?不如来玩工厂编程师,免费学编程逻辑的小游戏...
- openkruise 缩容_Linus 本尊也来了!为什么 KubeCon 越来越火了?