指数型生成函数(EGF)略解
因为我菜,所以我只能把重点的写一手。
学习了这篇文章
首先,生成函数是来简化运算、方便表达的。
e x = ∑ i = 0 ∞ x i i ! e^x=\sum_{i=0}^{\infty}\frac{x^i}{i!} ex=i=0∑∞i!xi
然后给出一堆式子:
G ^ ( x ) = 1 − x + x 2 2 ! − x 3 3 ! + ⋯ = e − x G ^ ( x ) = 1 + x 2 2 ! + x 4 4 ! + x 6 6 ! ⋯ = e x + e − x 2 G ^ ( x ) = x + x 3 3 ! + x 5 5 ! + x 7 7 ! ⋯ = e x − e − x 2 G ^ ( x ) = x − x 2 2 + x 3 3 ⋯ = ln ( 1 + x ) G ^ ( x ) = x − x 3 3 ! + x 5 5 ! ⋯ = sin x G ^ ( x ) = 1 + x 2 2 ! − x 4 4 ! + x 6 6 ! ⋯ = cos x \hat G(x)=1-x+\frac{x^2}{2!}-\frac{x^3}{3!}+\dots= e^{-x} \\ \hat G(x)=1+\frac{x^2}{2!}+\frac{x^4}{4!}+\frac{x^6}{6!}\dots= \frac{e^x+e^{-x}}{2} \\ \hat G(x)=x+\frac{x^3}{3!}+\frac{x^5}{5!}+\frac{x^7}{7!}\dots= \frac{e^x-e^{-x}}{2} \\ \hat G(x)=x-\frac{x^2}{2}+\frac{x^3}{3}\dots= \ln(1+x) \\ \hat G(x)=x-\frac{x^3}{3!}+\frac{x^5}{5!}\dots= \sin x \\ \hat G(x)=1+\frac{x^2}{2!}-\frac{x^4}{4!}+\frac{x^6}{6!}\dots= \cos x G^(x)=1−x+2!x2−3!x3+⋯=e−xG^(x)=1+2!x2+4!x4+6!x6⋯=2ex+e−xG^(x)=x+3!x3+5!x5+7!x7⋯=2ex−e−xG^(x)=x−2x2+3x3⋯=ln(1+x)G^(x)=x−3!x3+5!x5⋯=sinxG^(x)=1+2!x2−4!x4+6!x6⋯=cosx
因为你最后答案不可能带 e e e ,这只是中间量,所以现在tm可以开始写题了(
CF891E
如果你没有和我一样读错题的话,你会发现每次答案的增加量等于 ∏ a i \prod a_i ∏ai的减少量,那么设 b i b_i bi 为最后第 i i i 个数减了多少次 1 1 1,答案其实就是 ∏ a i − ∏ ( a i − b i ) \prod a_i-\prod (a_i-b_i) ∏ai−∏(ai−bi)。
所以我们现在考虑如何求 ∏ ( a i − b i ) \prod (a_i-b_i) ∏(ai−bi)的期望。
考虑对于一组 ∑ b i = k \sum b_i=k ∑bi=k 对期望的贡献我们如何计算。
E = 1 n k k ! ∏ i = 1 n b i ! ∏ i = 1 n ( a i − b i ) = k ! n k ∏ i = 1 n a i − b i b i ! \mathbb{E}=\frac{1}{n^k} \frac{k!}{\prod\limits_{i=1}^n b_i!}\prod_{i=1}^n (a_i-b_i)=\frac{k!}{n^k}\prod_{i=1}^n \frac{a_i-b_i}{b_i!} E=nk1i=1∏nbi!k!i=1∏n(ai−bi)=nkk!i=1∏nbi!ai−bi
其中, n k n^k nk 表示所有可能的操作序列数, k ! ∏ i = 1 n b i ! \frac{k!}{\prod\limits_{i=1}^n b_i!} i=1∏nbi!k! 是众所周知的将 n n n 种不同颜色,个数分别为 b 1 … b n b_1\dots b_n b1…bn,总数为 k k k 的小球摆成一排的方案数。
然后我们考虑后面这坨 ∏ a i − b i b i ! \prod \frac{a_i-b_i}{b_i!} ∏bi!ai−bi 能不能用生成函数做。构造指数型生成函数
f ^ i ( x ) = ∑ j = 0 ∞ a i − j j ! x j = ∑ j = 0 ∞ a i j ! x j − x ⋅ x j − 1 ( j − 1 ) ! = ( a i − x ) e x \hat f_i(x)=\sum_{j=0}^{\infty}\frac{a_i-j}{j!}x^j=\sum_{j=0}^{\infty}\frac{a_i}{j!}x^j-\frac{x\cdot x^{j-1}}{(j-1)!}=(a_i-x)e^x f^i(x)=j=0∑∞j!ai−jxj=j=0∑∞j!aixj−(j−1)!x⋅xj−1=(ai−x)ex
对于整体来说
F ^ ( x ) = ∏ i = 1 n f ^ i = e n x ∏ i = 1 n ( a i − x ) \hat F(x)=\prod_{i=1}^n \hat f_i=e^{nx}\prod_{i=1}^n(a_i-x) F^(x)=i=1∏nf^i=enxi=1∏n(ai−x)
我们要求出 [ x k ] F ^ ( x ) [x^k]\hat F(x) [xk]F^(x),好像有点可做了。
令
G ( x ) = ∏ i = 1 n ( a i − x ) = ∑ i = 0 n c i x i G(x)=\prod_{i=1}^n (a_i-x)=\sum_{i=0}^{n}c_ix^i G(x)=i=1∏n(ai−x)=i=0∑ncixi
然后发现
[ x k ] F ^ ( x ) = ∑ i = 0 n c i n k − i ( k − i ) ! [x^k]\hat F(x)=\sum_{i=0}^n c_i\frac{n^{k-i}}{(k-i)!} [xk]F^(x)=i=0∑nci(k−i)!nk−i
咱们回溯一下发现
E = ∑ i = 0 n c i k ! ( k − i ) ! n i \mathbb{E}=\sum_{i=0}^n c_i\frac{k!}{(k-i)!n^i} E=i=0∑nci(k−i)!nik!
ohhhhhhh
最后输出 c 0 − E c_0-\mathbb{E} c0−E 即可。这题 n n n 很小, G ( x ) G(x) G(x) 直接 O ( n 2 ) O(n^2) O(n2) 暴力算出来就好了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define Mod 1000000007
#define MN 5005
int ksm(int a,int x){int ans=1,w=a;while(x){if(x&1)ans=ans*w%Mod;w=w*w%Mod;x>>=1;}return ans;
}
int n,k,a[MN],f[MN];
signed main(){scanf("%lld%lld",&n,&k);f[0]=1;for(int i=1;i<=n;++i){scanf("%lld",&a[i]);for(int j=i;j;--j){f[j]=(f[j]*a[i]-f[j-1]+Mod)%Mod;}f[0]=f[0]*a[i]%Mod;}int res=0,tmp=1,inv=ksm(n,Mod-2);for(int i=0;i<=n;++i){res=(res+f[i]*tmp)%Mod;tmp=tmp*(k-i)%Mod*inv%Mod;}printf("%lld\n",(f[0]-res+Mod)%Mod);return 0;
}
CTS2019 珍珠
这以后肯定要成为时代的眼泪了。。。
题目的要求其实是:
∑ i = 1 D ⌊ c n t i 2 ⌋ ≥ m \sum_{i=1}^D\lfloor\frac{cnt_i}{2}\rfloor \ge m i=1∑D⌊2cnti⌋≥m
∑ i = 1 D c n t i − c n t i m o d 2 2 ≥ m \sum_{i=1}^D\frac{cnt_i-cnt_i\bmod2}{2} \ge m i=1∑D2cnti−cntimod2≥m
n − ∑ i = 1 D c n t i m o d 2 2 ≥ m \frac{n-\sum_{i=1}^D cnt_i\bmod2}{2} \ge m 2n−∑i=1Dcntimod2≥m
n − ∑ i = 1 D c n t i m o d 2 ≥ 2 m {n-\sum_{i=1}^D cnt_i\bmod2} \ge 2m n−i=1∑Dcntimod2≥2m
∑ i = 1 D c n t i m o d 2 ≤ n − 2 m \sum_{i=1}^D cnt_i\bmod 2\le n-2m i=1∑Dcntimod2≤n−2m
这个柿子看起来很阳间,首先我们可以把 n − 2 m ≤ 0 n-2m\le 0 n−2m≤0和 D ≤ n − 2 m D\le n-2m D≤n−2m 的情况特判掉,然后考虑上网搜题解。
题解说:二项式反演
设 f i f_i fi 表示有 i i i 个颜色是奇数的方案数, g i g_i gi 表示至少 i i i 个 颜色是奇数的方案数。我们最后要求的是
∑ i = 0 n − 2 m f i \sum_{i=0}^{n-2m}f_i i=0∑n−2mfi
不难发现, g j = ∑ ( i j ) f i g_j=\sum \binom{i}{j}f_i gj=∑(ji)fi
然后上二项式反演
f i = ∑ j = i D ( − 1 ) j − i ( j i ) g j f_i=\sum_{j=i}^D (-1)^{j-i}\binom{j}{i}g_j fi=j=i∑D(−1)j−i(ij)gj
我们枚举 i − j i-j i−j ,也就是
f i = ∑ j ∑ j − k = i ( − 1 ) k k ! j ! g j i ! f_i=\frac{\sum_j\sum_{j-k=i} \frac{(-1)^k}{k!} j!g_j}{i!} fi=i!∑j∑j−k=ik!(−1)kj!gj
这东西令 A i = ( − 1 ) D − i ( D − i ) , B i = i ! × g i A_i=\frac{(-1)^{D-i}}{(D-i)},B_i=i! \times g_i Ai=(D−i)(−1)D−i,Bi=i!×gi 卷一下即可。
然后我们考虑 g i g_i gi 怎么求。
一个颜色出现奇数次的EGF为: e x − e − x 2 \frac{e^x-e^{-x}}{2} 2ex−e−x,随便出现的EGF为 e x e^x ex
于是
g i = ( D i ) n ! [ x n ] ( e x − e − x 2 ) i ( e x ) D − i g_i=\binom{D}{i}n![x^n](\frac{e^x-e^{-x}}{2})^i (e^x)^{D-i} gi=(iD)n![xn](2ex−e−x)i(ex)D−i
g i = ( D i ) n ! 2 i [ x n ] ( e x − e − x ) i ( e x ) D − i g_i=\binom{D}{i}\frac{n!}{2^i}[x^n]({e^x-e^{-x}})^i (e^x)^{D-i} gi=(iD)2in![xn](ex−e−x)i(ex)D−i
g i = ( D i ) n ! 2 i [ x n ] ∑ j = 0 i ( i j ) ( − 1 ) i − j e j e ( j − i ) x ( e x ) D − i g_i=\binom{D}{i}\frac{n!}{2^i}[x^n]\sum_{j=0}^i \binom{i}{j}(-1)^{i-j} e^j e^{(j-i)x} (e^x)^{D-i} gi=(iD)2in![xn]j=0∑i(ji)(−1)i−jeje(j−i)x(ex)D−i
g i = ( D i ) n ! 2 i [ x n ] ∑ j = 0 i ( i j ) ( − 1 ) i − j ( e x ) D − 2 ( i − j ) g_i=\binom{D}{i}\frac{n!}{2^i}[x^n]\sum_{j=0}^i \binom{i}{j}(-1)^{i-j} (e^x)^{D-2(i-j)} gi=(iD)2in![xn]j=0∑i(ji)(−1)i−j(ex)D−2(i−j)
g i = ( D i ) n ! 2 i [ x n ] ∑ j = 0 i ( i j ) ( − 1 ) i − j e ( D − 2 ( i − j ) ) x g_i=\binom{D}{i}\frac{n!}{2^i}[x^n]\sum_{j=0}^i \binom{i}{j}(-1)^{i-j} e^{(D-2(i-j))x} gi=(iD)2in![xn]j=0∑i(ji)(−1)i−je(D−2(i−j))x
然后把 [ x n ] e a x [x^n]e^{ax} [xn]eax的定义式 a n x n ! \frac{a^nx}{n!} n!anx 甩进去
g i = ( D i ) n ! 2 i ∑ j = 0 i ( i j ) ( − 1 ) i − j ( D − 2 ( i − j ) ) n n ! g_i=\binom{D}{i}\frac{n!}{2^i}\sum_{j=0}^i \binom{i}{j}(-1)^{i-j} \frac{ (D-2(i-j))^n}{n!} gi=(iD)2in!j=0∑i(ji)(−1)i−jn!(D−2(i−j))n
g i = D ! 2 i ( D − i ) ! ∑ j = 0 i ( − 1 ) i − j j ! ( i − j ) ! ( D − 2 ( i − j ) ) n g_i=\frac{D!}{2^i (D-i)!}\sum_{j=0}^i \frac{(-1)^{i-j}}{j!(i-j)!} { (D-2(i-j))^n} gi=2i(D−i)!D!j=0∑ij!(i−j)!(−1)i−j(D−2(i−j))n
这个 i − j i-j i−j 太丑了,不如枚举,于是
g i = D ! 2 i ( D − i ) ! ∑ j = 0 i ( − 1 ) j ( D − 2 j ) n j ! ( i − j ) ! g_i=\frac{D!}{2^i (D-i)!}\sum_{j=0}^i \frac{(-1)^{j}(D-2j)^n}{j!(i-j)!} gi=2i(D−i)!D!j=0∑ij!(i−j)!(−1)j(D−2j)n
然后发现它竟然可以卷积了,我真是太感动了
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define MN 100005
#define Mod 998244353
int ksm(int a,int x){int ans=1,w=a;while(x){if(x&1)ans=ans*w%Mod;w=w*w%Mod;x>>=1;}return ans;
}
int fac[MN],dfac[MN],inv[MN];
int A[MN<<2],B[MN<<2],r[MN<<2];
int C(int m,int n){if(m<n)return 0;return fac[m]*dfac[n]%Mod*dfac[m-n]%Mod;
}
const int G=3,invG=(Mod+1)/3;
void NTT(int *f,int n,int op){for(int i=0;i<n;++i)if(i<r[i])swap(f[i],f[r[i]]);for(int len=1;len<n;len<<=1){int p=len<<1;int w=ksm(op?G:invG,(Mod-1)/p);for(int i=0;i<n;i+=p){int buf=1;for(int l=i;l<i+len;++l){int tmp=buf*f[l+len]%Mod;f[l+len]=(f[l]-tmp+Mod)%Mod;f[l]=(f[l]+tmp)%Mod;buf=buf*w%Mod;}}}if(!op){int inv=ksm(n,Mod-2);for(int i=0;i<n;++i)f[i]=f[i]*inv%Mod;}
}
int D,n,m;
signed main(){scanf("%lld%lld%lld",&D,&n,&m);if(m*2<=n-D){printf("%lld\n",ksm(D,n));return 0;}if(m*2>n){puts("0");return 0;}fac[0]=dfac[0]=fac[1]=dfac[1]=inv[1]=1;for(int i=2;i<=D;++i){fac[i]=fac[i-1]*i%Mod;inv[i]=(Mod-Mod/i)*inv[Mod%i]%Mod;dfac[i]=dfac[i-1]*inv[i]%Mod;}int buf=1;for(int i=0;i<=D;++i){A[i]=buf*dfac[i]%Mod*ksm((D-i*2+Mod)%Mod,n)%Mod;buf=Mod-buf;}for(int i=0;i<=D;++i)B[i]=dfac[i];int len=1;while(len<=D*2)len<<=1;for(int i=0;i<len;++i)r[i]=(r[i>>1]>>1)|((i&1)?(len>>1):0);NTT(A,len,1);NTT(B,len,1);for(int i=0;i<len;++i)A[i]=A[i]*B[i]%Mod;NTT(A,len,0);buf=1;int w=(Mod+1)/2;for(int i=0;i<=D;++i){A[i]=A[i]*buf%Mod*fac[i]%Mod;buf=buf*w%Mod*(D-i)%Mod;B[i]=((D-i&1)?(Mod-1):1)*dfac[D-i]%Mod;}for(int i=D+1;i<len;++i)A[i]=B[i]=0;int ans=0;NTT(A,len,1);NTT(B,len,1);for(int i=0;i<len;++i)A[i]=A[i]*B[i]%Mod;NTT(A,len,0);for(int i=0;i<=n-2*m;++i)ans=(ans+dfac[i]*A[i+D])%Mod;printf("%lld\n",ans);return 0;
}
指数型生成函数(EGF)略解相关推荐
- 指数型生成函数[bzoj3456]城市规划
前言 打完多项式板子后的第一题+清真的题意 题目相关 题目链接 题目大意 求nnn个点的简单(无重边无自环)无向连通图数目 输出模1004535809(479∗221+1)1004535809(479 ...
- [TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)
文章目录 题目 题解 code1(NTT) code2(EGF+卷积) 题目 大中锋的学院要组织学生参观博物馆,要求学生们在博物馆中排成一队进行参观.他的同学可以分为四类:一部分最喜欢唱.一部分最喜欢 ...
- 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 2 | 扩展到整数解 )
文章目录 一.使用生成函数求解不定方程解个数示例 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多 ...
- 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 )
文章目录 一.使用生成函数求解不定方程解个数示例 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多 ...
- 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数 )
文章目录 一.使用生成函数求解不定方程解个数 1.带限制条件 2.带系数 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与 ...
- Golang 的 “omitempty” 关键字略解
转载地址:Golang 的 "omitempty" 关键字略解 原文 :Golang 的 "omitempty" 关键字略解[1] 用法 熟悉 Golang 的 ...
- 《孙子略解》曹操注-2011
[size=medium] 〈序〉 操闻上古弧矢之利,<论语>:「足兵.」<尚书>:「八政曰师.」<易>曰:「 师贞,丈人吉.」<诗>曰:「王赫斯怒,爰 ...
- 【Cylinder3D论文解读及代码略解】
Cylinder3D论文解读及代码略解 论文解读 Abstract Introduction Related work 室内点云分割 室外点云分割 3D体素划分 Methodology(本文方法) C ...
最新文章
- 使用未编译的XAML动态生成WPF控件
- 数据存储之-SQLite数据库二
- ADO.net商机题目
- 2021年程序员1月薪资大幅度上涨,你的2021有奔头了吗?
- 手机MODEM 开发(28)--- VoLTE介绍
- 读卡器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 小米手机不弹出usb连接设置_安卓手机数据备份教程(华为、小米、oppo、vivo)...
- DataSet自定义添加table并添加数据
- Beyond Compare比较文件夹时如何忽略文件
- 一些利用开源浏览器核心开发专用浏览器的连接
- 亚马逊成功的四个关键因素
- Pytorch版Lookahead使用及遇到的问题
- nuc7 android tv,第七代的进化,Intel NUC7i3BNH 开箱评测拆解
- expects parameter 1 to be resource, array given 错误解析
- 这一次,卡98%问题终于解决了
- stm32L451比较器使用
- Raspberry Pi 支持开源脑机接口
- margin塌陷如何解决
- 企业应用程序安全的新「守护神」
- 北京积分落户2021年分数预估