因为我菜,所以我只能把重点的写一手。

学习了这篇文章

首先,生成函数是来简化运算、方便表达的。

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−x​G^(x)=x+3!x3​+5!x5​+7!x7​⋯=2ex−e−x​G^(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=nk1​i=1∏n​bi​!k!​i=1∏n​(ai​−bi​)=nkk!​i=1∏n​bi​!ai​−bi​​
其中, n k n^k nk 表示所有可能的操作序列数, k ! ∏ i = 1 n b i ! \frac{k!}{\prod\limits_{i=1}^n b_i!} i=1∏n​bi​!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​−j​xj=j=0∑∞​j!ai​​xj−(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∏n​f^​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∑n​ci​xi

然后发现
[ 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∑n​ci​(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∑n​ci​(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∑D​2cnti​−cnti​mod2​≥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=1D​cnti​mod2​≥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∑D​cnti​mod2≥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∑D​cnti​mod2≤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−2m​fi​

不难发现, 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=i​k!(−1)k​j!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∑i​j!(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∑i​j!(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)略解相关推荐

  1. 指数型生成函数[bzoj3456]城市规划

    前言 打完多项式板子后的第一题+清真的题意 题目相关 题目链接 题目大意 求nnn个点的简单(无重边无自环)无向连通图数目 输出模1004535809(479∗221+1)1004535809(479 ...

  2. [TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)

    文章目录 题目 题解 code1(NTT) code2(EGF+卷积) 题目 大中锋的学院要组织学生参观博物馆,要求学生们在博物馆中排成一队进行参观.他的同学可以分为四类:一部分最喜欢唱.一部分最喜欢 ...

  3. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  4. 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 2 | 扩展到整数解 )

    文章目录 一.使用生成函数求解不定方程解个数示例 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多 ...

  5. 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 )

    文章目录 一.使用生成函数求解不定方程解个数示例 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多 ...

  6. 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数 )

    文章目录 一.使用生成函数求解不定方程解个数 1.带限制条件 2.带系数 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与 ...

  7. Golang 的 “omitempty” 关键字略解

    转载地址:Golang 的 "omitempty" 关键字略解 原文 :Golang 的 "omitempty" 关键字略解[1] 用法 熟悉 Golang 的 ...

  8. 《孙子略解》曹操注-2011

    [size=medium] 〈序〉 操闻上古弧矢之利,<论语>:「足兵.」<尚书>:「八政曰师.」<易>曰:「 师贞,丈人吉.」<诗>曰:「王赫斯怒,爰 ...

  9. 【Cylinder3D论文解读及代码略解】

    Cylinder3D论文解读及代码略解 论文解读 Abstract Introduction Related work 室内点云分割 室外点云分割 3D体素划分 Methodology(本文方法) C ...

最新文章

  1. 使用未编译的XAML动态生成WPF控件
  2. 数据存储之-SQLite数据库二
  3. ADO.net商机题目
  4. 2021年程序员1月薪资大幅度上涨,你的2021有奔头了吗?
  5. 手机MODEM 开发(28)--- VoLTE介绍
  6. 读卡器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  7. 小米手机不弹出usb连接设置_安卓手机数据备份教程(华为、小米、oppo、vivo)...
  8. DataSet自定义添加table并添加数据
  9. Beyond Compare比较文件夹时如何忽略文件
  10. 一些利用开源浏览器核心开发专用浏览器的连接
  11. 亚马逊成功的四个关键因素
  12. Pytorch版Lookahead使用及遇到的问题
  13. nuc7 android tv,第七代的进化,Intel NUC7i3BNH 开箱评测拆解
  14. expects parameter 1 to be resource, array given 错误解析
  15. 这一次,卡98%问题终于解决了
  16. stm32L451比较器使用
  17. Raspberry Pi 支持开源脑机接口
  18. margin塌陷如何解决
  19. 企业应用程序安全的新「守护神」
  20. 北京积分落户2021年分数预估

热门文章

  1. Java基础逻辑运算符
  2. 台式计算机启动不了,台式机找到u盘但启动不了解决方法
  3. Linux Shell脚本编程--curl命令详解
  4. 1.用于记录Lightroom的快捷键
  5. 免费机票【SPFA】【南华大学第十五届ACM程序设计竞赛】
  6. Unity Ugui 优化 DrawCall
  7. Unity Draw Call
  8. 百度android代码命名规范
  9. 16. Zuul 源码讲解
  10. 2023计算机毕业设计SSM最新选题之javajava二手书交易系统1rn8a